爬取糗事百科最新的段子

  最近突然对爬虫颇感兴趣,于是一直在学习静觅的技术博客,这篇权当是篇学习笔记罢。

1. 准备

  简单起见,我们只需要实现把最新的段子爬取,并且把图片过滤即可。也就是说,我们需要爬取的网站是http://www.qiushibaike.com/hot/page/1,1表示最新一页,第一页的意思。

  糗事百科不需要登录即可以实现爬虫,但是有个地方需要注意,获取网页的时候需要加入含有 User-Agent 信息的头部。这个名为User-Agent的信息,可以这样获得,如下:

  打开浏览器,进入网址,按下F12,接着按下F5刷新页面,在调试面板上点击Network,效果如下:

  image_1bq2s53iis43qk9mui1vca37s11.png-134.7kB

  有个这个字段的头部信息,我们就可以开开心心地爬虫了。接下来则是观察其html的标签、结构,然后构造正则表达式去匹配。空白处右键选择查看网页源代码,如下:

  image_1bq2sla64bobns5tgn8h910r1e.png-46kB

  有了这些分析,写代码应该就很容易了。

2. 代码

# -*- coding:utf-8 -*-
import urllib2
import re

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

def analysis(ori_html):
	pattern = re.compile('<div class="article block untagged mb15 .*?" id=.*?>.*?' \
		'<div.*?author clearfix">.*?<a.*?<img.*?alt="(?P<user>.*?)">.*?</a>.*?<a.*?<h2>.*?</h2>' \
		'.*?<div.*?<span>(?P<content>.*?)</span>.*?stats-vote">.*?<i class="number">(?P<vote>.*?)</i>' \
		'.*?stats-comments">.*?<i class="number">(?P<comment>.*?)</i>', re.S)
	items = re.findall(pattern, ori_html)
	count = 1
	for item in items:
		print "---------------------------------" + str(count) + "---------------------------------"
		
		user = item[0]
		content = item[1]
		vote = item[2]
		comment = item[3]

		print "用户:" + user
		print "内容:\n\t" + content.strip('\n').replace('<br/>', '\n\t')
		print "点赞数:" + vote
		print "评论数:" + comment

		count += 1
		print ""


if __name__ == "__main__":
	page = 1
	url = "http://www.qiushibaike.com/hot/page/" + str(page)
	user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) " \
				"AppleWebKit/537.36 (KHTML, like Gecko) " \
				"Chrome/57.0.2987.110 Safari/537.36"
	headers = {'User-Agent' : user_agent}
	try:
		request = urllib2.Request(url, headers = headers)
		response = urllib2.urlopen(request)
		ori_html = response.read().decode('UTF-8')
		analysis(ori_html)
	except urllib2.URLError, e:
		if hasattr(e, "code"):
			print e.code
		if hasattr(e, "reason"):
			print e.reason


3. 运行结果

  image_1bq2splgvshv13g510ska5a69v1r.png-79.9kB

posted @ 2017-09-15 21:50  va_chester  阅读(290)  评论(0编辑  收藏  举报