[python爬虫]利用urllib2爬取百度贴吧帖子相关内容

来源:互联网 发布:散打软件 编辑:程序博客网 时间:2024/06/07 00:01

版本号:Python2.7.5,
所谓爬虫就是把指定网页中的指定类型内容通过程序抓取并保存到本地。

工具

- **google chrome**- **fiddler**

步骤

打开指定帖吧
这里写图片描述

打开fiddler
这里写图片描述

将代理跳到fiddler,选中fiddler0626
这里写图片描述

此时当前页面会刷新,我们到fiddler去看抓包情况
这里写图片描述
此时我们双击序号一的链接,inspectors下的raw显示了此链接的请求信息,下面的raw则显示了此网页的抓取到的信息,是html类型显示
这里写图片描述
抓取到信息时,知道这是一个get请求,我们对报头(inspectors下的raw)进行删减(下图蓝色部分),在composer下raw点击executo测试看数据是否有变化
这里写图片描述
对上图蓝色部分进行删除,点击executo,在左侧查看请求情况
这里写图片描述
result等于200 代表请求成功,这样多次删除发现,只留下get 请求依然可以请求数据成功,所以我们只保留get 请求链接,并复制其中的http链接
这里写图片描述
打开一个新建一个 tieba.py 文件

#coding=UTF-8import urllib2               **#导入相应库与函数**import urllibimport  jsonfrom lxml import etreeimport chardetitem={}                             **#新建一个字典**output = open('baidutb.json','w')                 **#打开一个json文件**num = int(raw_input('请输入你要爬取的页数:'))i = 1while i<=num:      #进入循环读取每页的帖子    request = urllib2.Request('http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=utf-8&pn='+str((i-1)*50)+'')  **#由于pn后面的值控制着每页的链接,所以对pn= 后面加上不同的字符串数字,因为页数链接pn=后面都是50的倍数所以每次进行翻倍**    response = urllib2.urlopen(request)  #请求链接    resHtml = response.read().decode('utf-8')    html = etree.HTML(resHtml)    result = html.xpath('//li[@class=" j_thread_list clearfix"]')       **#在html中运用xpath寻找相应标签,即每个li[@class=" j_thread_list clearfix]类型的标签都是相应帖子的源代码**    print type(result)    b=0    for site in result:      **#循环遍历这一页中每个帖子的源码**        b+=1        item['data-field'] = site.attrib['data-field'].strip()        item['replay'] = site.xpath('./div/div[1]/span')[0].text.strip()    **#得到此贴的回复数**        print item['replay']        item['title'] = site.xpath('./div/div[2]/div[1]/div[1]/a')[0].text.strip()  **#得到此贴的标题**        item['author_name'] = site.xpath('./div/div[2]/div[1]/div[2]/span')[0].attrib['title'].strip()   **#得到此贴的作者名**        item['words'] = site.xpath('.//div[@class="threadlist_abs threadlist_abs_onlyline "]')[0].text.strip()   **#得到一楼内容**        item['replayer'] = site.xpath('.//span[@class="tb_icon_author_rely j_replyer"]')[0].attrib['title'].strip()  **#得到最后回复人名称**        item['replaytime'] =site.xpath('.//span[@class="threadlist_reply_date pull_right j_reply_data"]')[0].text.strip()  **#得到组后回复时间**        line = json.dumps(item,ensure_ascii=False)+ '\n'        output.write('第'+str(i)+'页 第'+str(b)+'贴-------------------- ')        output.write(line.encode('utf-8'))    i+=1output.close()

此时与tieba.py同目录的文件夹下应该有baidutb.json文件,里面数据就是当前贴吧帖子
这里写图片描述

response = urllib2.urlopen(request) #请求链接
resHtml = response.read().decode('utf-8')
html = etree.HTML(resHtml)
这三行代码就是打开链接并把链接下的所有源代码放到变量html里面。那么我们是怎么从html里找到想要的信息的呢?
我们先打开谷歌的xpath插件,
这里写图片描述
然后右击任意帖子标题选中检查,得到当前帖子html代码块,是一个li 标签下的a标签,并且a标签所在的li标签就代表当前检查的帖子
这里写图片描述
这里写图片描述
那么我们在xpath下根据xpth语法找到所有这种标签即找到并选中了所有当前页的帖子
这里写图片描述
那么
result = html.xpath('//li[@class=" j_thread_list clearfix"]')
就是把所有这种标签放到result列表里,同样就可以便利标签并用xpath找到标签里想要的信息

0 0
原创粉丝点击