第一个版本
利用urllib2库获取糗事百科的html代码。
这个就比较简单,如下:
#encoding=utf-8
#功能:抓取糗事百科段子的第一个版本
import urllib
import urllib2
url="http://www.qiushibaike.com/hot/page/1"
#添加一个请求头
user_agent="Mozilla/5.0 (Windows NT 6.1)"
headers={"User-Agent":user_agent}
try:
request=urllib2.Request(url,headers=headers)
response=urllib2.urlopen(request)
print response.read()
except urllib2.URLError,e:
if hasattr(e,"code"):
print e.cond
if hasattr(e,"reason"):
print e.reason
第二个版本
在第一个版本获得了糗事百科的html代码之后,我们就可以开始解析了,这里利用正则表达式匹配。实现代码如下:
#encoding=utf-8
#功能:抓取糗事百科的第二个版本
import urllib
import urllib2
import re
from bs4 import BeautifulSoup
url="http://www.qiushibaike.com/hot/page/1"
user_agent="Mozilla/5.0 (Windows NT 6.1)"
headers={"User-Agent":user_agent}#请求头
try:
request=urllib2.Request(url,headers=headers)
response=urllib2.urlopen(request)
content = response.read().decode('utf-8')
#利用正则进行匹配
pattern = re.compile('<div.*?author clearfix">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?'+
'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>',re.S)
items = re.findall(pattern,content)
for item in items:
haveImg=re.search("img",item[3])#判断是否有图片
if not haveImg:
print item[0],item[1],item[2],item[4]
# soup=BeautifulSoup(response.read().decode("utf-8"),"html.parser")
# soup.div
except urllib2.URLError,e:
if hasattr(e,"code"):
print e.code
if hasattr(e,"reason"):
print e.reason
上面唯一的难点是关于匹配段子的正则表达式是如何来的,下面来分析一下:
在糗事百科的页面,按下F12,我们可以看到html的代码中一个段子的html代码格式如下:
<div class="article block untagged mb15" id='qiushi_tag_114112006'>
<div class="author clearfix">
<a href="/users/9535881" target="_blank" rel="nofollow">
<img src="http://pic.qiushibaike.com/system/avtnew/953/9535881/medium/20151121100928.jpg" alt="S姐姐8911"/>
</a>
<a href="/users/9535881" target="_blank" title="S姐姐8911">
<h2>S姐姐8911</h2>
</a>
</div>
<div class="content">
刚在农业银行自动取款机捡到一张银行卡,反面还有密码,好奇心查了下,有560元。 不算多,但还是步行了1公里找到家农业银行营业部去上交,只为肚子里的宝宝攒个人品。
<!--1449326166-->
</div>
<div class="thumb">
<a href="/article/114112006" target="_blank">
<img src="http://pic.qiushibaike.com/system/pictures/11411/114112006/medium/app114112006.jpg" alt="刚在农业银行自动取款机捡到一张银行卡" />
</a>
</div>
<div class="stats">
<span class="stats-vote"><i class="number">2099</i> 好笑</span>
<span class="stats-comments">
<span class="dash"> · </span>
<a href="/article/114112006" data-share="/article/114112006" id="c-114112006" class="qiushi_comments" target="_blank">
<i class="number">160</i> 评论
</a>
</span>
</div>
根据上面的html格式,就提取出来了如下的正则表达式:
'<div.*?author clearfix">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>'
如果上面的正则表达式失效,我们可以在糗事百科的网页上观察每个段子在html代码中的格式是怎么样的,然后我们提取出相应的正则表达式来匹配就可以了。