爬虫二:爬取糗事百科段子

  这一次我们利用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以后显示的页面网址与页面每条段子:

 我们进行了岁恢复内容的爬取,并注上第几次楼(沙发):

 

只要勤加练习相信我,爬虫对你来说不是问题,爬虫所用的库各种各样,找到一种你喜欢的。

 

posted @ 2017-05-16 20:48  张大猛  阅读(896)  评论(0编辑  收藏  举报