python第一次实现爬数据,不过还是不太懂其中的原理,只是拿过来就用了

第一次实现了爬数据,小心脏还是挺高兴的。

试着在爬下了百度的新闻,然后美团的数据,饿了吗和新浪试了下不行,原因可能是https的关系

这是抓取的美团的数据,不过User-Agent的参数要填自己的,建议用fiddler2抓包工具

python第一次实现爬数据,不过还是不太懂其中的原理,只是拿过来就用了



话不多说,上代码。

# -*- coding:utf-8 -*-
import re
from bs4 import BeautifulSoup
import json
import threading
from requests import Session
class dazp_bj:
    def __init__(self,category):
        self.baseUrl='https://http://sz.meituan.com'
        self.bgurl=category[0]
        self.typename=category[1]
        self.page=1
        self.pagenum=10 #设置最大页面数目,大众点评每个条目下最多有50页,可以根据自己需求进行设置
        self.headers={
            "Host":"report.meituan.com",
            "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko",
            #此User-Agent是我本人的参数,在使用时记得修改为自己的参数,如何获取下四.4部分有讲解
            "Referer":"http://sz.meituan.com/?utm_campaign=baidu&utm_medium=organic&utm_source=baidu&utm_content=homepage&utm_term=",
        }
    def start(self):
        self.s=Session()    #定义一个Session()对象
        print self.bgurl,self.typename
        print "please wait for 15"
        dazp_bj.__parseHtml(self,self.bgurl) #调用__parseHtml函数
        print 'getdata down'
    def __parseHtml(self,preurl):
        _json=dict()    #定义一个字典用以存储数
        html=self.s.post(preurl,headers=self.headers).text  #发送请求,获取html
        soup=BeautifulSoup(html,'lxml') #进行解析
        name=['href','title','人均消费','地址','评分','链接']
        for li in soup.find('body').find('div',class_='J-holy-reco__content holy-reco__content').find_all('a'):
            _json[name[0]] = li['href']
            _json[name[1]] = li['title'].encode('utf-8')
            with open(self.typename+'.json','a') as outfile:
                json.dump(_json,outfile,ensure_ascii=False)
            with open(self.typename+'.json','a') as outfile:
                outfile.write(',\n')
        # self.page+=1
        # if self.page<=self.pagenum:
        #     self.nexturl=self.baseUrl+soup.find('div',class_='page').find('a',class_='next')['href']  #获得下一页的链接
        #     dazp_bj.__parseHtml(self,self.nexturl)
if __name__=='__main__':
    cat=[(r'http://sz.meituan.com/?utm_campaign=baidu&utm_medium=organic&utm_source=baidu&utm_content=homepage&utm_term=',u'火锅 ')]
    obj=list()
    obj.append(dazp_bj(cat[0]))
    [threading.Thread(target=foo.start(),args=()).start for foo in obj]#多线程执行obj列表中的任务