《python爬虫实战》:爬糗百上的段子

第一个版本

利用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代码中的格式是怎么样的,然后我们提取出相应的正则表达式来匹配就可以了。

你可能感兴趣的:(html,windows,python,爬虫,url)