目标:爬取百度糗事百科段子,url 为http://www.qiushibaike.com/,爬取前20个网页中每个网页的每个段子的发布人、段子内容、点赞数、评论数,然后把内容保存在一个 BaiduQiushi.txt 文件中。
一、 分析网页结构
通过分析 url 可以发现规律,使用该规律来实现换页功能。
即:” http://www.qiushibaike.com/8hr/page/” + pagenum +”/?s=4966067”
然后查看页面源代码,辅助 chrome 审查元素元素功能快速定位所需内容位置。
可以发现,每个段子都是包括在div 标签内的。
发布人:
段子内容:
点赞数:
评论数:
二、 确定使用技术路线
这里获取内容的方式有很多种,可以使用 requests + re 。也可是使用 beautifulsoup。
不过感觉这个例子比较小,我就只使用了 requests 和 re 来实现。
三、 步骤
1. 实现换页功能,生成 url 列表 urls。
2. 遍历 urls 这个列表,解析每个页面的 html 源代码。
3. 对于每个 html,获得发布人模块,放置在 everyblock 列表中。
4. 遍历每个 everyblock 列表,提取每个段子的发布人、段子内容、点赞数、评论数
四、 代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/3/18 15:10
# @Author : zxp
# @Site :
# @File : zxp_CrowBaiduQiushi.py
# @Software: PyCharm Community Edition
import requests
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print url + ':获取失败!'
def getEveryBlock(html):
everyblock = re.findall('(<div class="article block untagged mb15".*?<div class="single-clear"></div>)', html, re.S)
return everyblock
def getInfo(block):
info = {}
info['author'] = re.search('<h2>(.*?)</h2>', block, re.S).group(1)
info['content'] = re.search('<span>(.*?)</span>', block, re.S).group(1)
likeandcomment = re.findall('<i class="number">(.*?)</i>', block, re.S)
info['like'] = likeandcomment[0]
if len(likeandcomment) == 1:
info['comment'] = '0'
else:
info['comment'] = likeandcomment[1]
return info
def saveAllInfo(all_info):
f = open('BaiduQiushi.txt', 'a')
for each in all_info:
f.writelines('author:' + each['author'] + '\n')
f.writelines('content:' + each['content'] + '\n')
f.writelines('like:' + each['like'] + '\n')
f.writelines('comment:' + each['comment'] + '\n\n')
f.close()
def main():
urls = []
all_info = []
pagenum = 20
for i in xrange(1, pagenum + 1):
url = 'http://www.qiushibaike.com/8hr/page/' + str(i) + '/?s=4966067'
urls.append(url)
for url in urls:
html = getHTMLText(url)
everyblock = getEveryBlock(html)
for each in everyblock:
info = getInfo(each)
all_info.append(info)
saveAllInfo(all_info)
if __name__ == '__main__':
main()