zoukankan      html  css  js  c++  java
  • 爬取糗事百科最新的段子

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

    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 "内容:
    	" + content.strip('
    ').replace('<br/>', '
    	')
    		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

  • 相关阅读:
    安装centos虚拟机
    关于区别广播域与冲突域
    网络七层架构
    怎么有效避免黑客使用跳板软件进行攻击窃取信息数据
    C语言猜数字游戏
    页置换算法FIFO、LRU、OPT
    Samza的ApplicationMaster
    Samza文档翻译 : Comparison Introduction
    Samza文档翻译 : Architecture
    Samza文档翻译 : Concepts
  • 原文地址:https://www.cnblogs.com/vachester/p/7528635.html
Copyright © 2011-2022 走看看