爬虫二:爬取糗事百科段子
这一次我们利用BeautifulSoup进行网页的解析,方法其实跟前一次的差不多,只是这里我们爬取的是糗事百科,糗事百科有反爬机制,我们需要模拟用户来访问糗事百科网站,也就是加上头部信息headers,其实整体思路与上一篇所写爬虫的思路差不多,拿个速度可以共用。
1、首先我们在打开网页,并在网页空白处右击选择“检查”在弹出的网页里选择"Network"
2、然后按下“F5”刷新一下
3、在刷新后的页面里我们可以看到多条信息,任意选择一条信息点开
4、在点开的页面最后我们可以看到我们需要获得用户信息(一次不行换别的在点击打开,会看到的)
这样头部信息的获取就完成了,对于网页每个部分就要你对网页有一定的了解了。
user_agent就是模拟用户登录时所携带的信息。
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 这里就是用户登录时所携带的信息。
headers = {'User-Agent':user_agent} 这里就是具体模拟用户访问了,在通过访问以后我们可以请求获得网页源码,然后我们在源码里进行匹配获取我们想要的信息。
1 # -*- coding: utf-8 -*- 2 3 __author__ = 'Demon' 4 5 import urllib2,re 6 from bs4 import BeautifulSoup 7 8 def getContentorComment(Url):#定义一个函数,用来获取源码 9 #模拟用户登录,加上headers就是为了攻破反爬 10 user_agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' 11 headers = {'User-Agent':user_agent} 12 req = urllib2.Request(url=Url,headers=headers)#以用户的身份请求获得源码 13 try:#异常处理,一般以5开头的错误都是网络错误 14 response = urllib2.urlopen(req)#打开源码 15 content = response.read()#读取源码 16 except Exception,e: 17 content = None#如果出现错误,就返回没有爬取源码 18 #print content 19 return content 20 21 articleUrl = "http://www.qiushibaike.com/textnew/page/%d" 22 commentUrl = "http://www.qiushibaike.com/article/%s" 23 page = 0 24 while True:#进行个用户输入 25 raw = raw_input("点击enter查看或者点击exit退出,请输入你的选择:") 26 if raw == "exit": 27 break 28 page+=1 29 Url = articleUrl % page 30 print Url 31 articalpage = getContentorComment(Url) 32 articleFloor = 1 33 soupArticle = BeautifulSoup(articalpage,'html.parser')#用BeautifulSoup进行网络解析 34 for string in soupArticle.find_all(attrs="article block untagged mb15"):#对文章编号进行获取 35 commentId = str(string.get('id')).strip()[11:]#获得文章编号 36 print "\n"#换行 37 #print commentId 38 print articleFloor,".",string.find(attrs="content").get_text().strip()#对文章的进行获取 39 articleFloor+=1 40 commentPage = getContentorComment(commentUrl % commentId) 41 if commentPage is None: 42 continue 43 soupComment = BeautifulSoup(commentPage,'html.parser') 44 commentFloor = 1 45 for comment in soupComment.find_all(attrs="body"):#对文章的评论进行获取 46 print " ",commentFloor,"楼回复:",comment.get_text() 47 commentFloor+=1
因为我们在设计的时候添加了人性化输入,既用户输入,当我们按下回车键的时候程序开始继续执行:
这是按下enter以后显示的页面网址与页面每条段子:
我们进行了岁恢复内容的爬取,并注上第几次楼(沙发):
只要勤加练习相信我,爬虫对你来说不是问题,爬虫所用的库各种各样,找到一种你喜欢的。
· 使用 .NET Core 实现一个自定义日志记录器
· [杂谈]如何选择:Session 还是 JWT?
· 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
· JavaScript是按顺序执行的吗?聊聊JavaScript中的变量提升
· [杂谈]后台日志该怎么打印
· 2000 Star,是时候为我的开源项目更新下功能了
· 面试官:DNS解析都整不明白,敢说你懂网络?我:嘤嘤嘤!
· [WPF UI] 为 AvalonDock 制作一套 Fluent UI 主题
· 基于.NET WinForm开发的一款硬件及协议通讯工具
· 内网穿透之http代理服务器