python-20:爬取糗事百科段子源碼

到這裏,咱們爬取糗事百科這個入門項目已經結束了,下面貼上源碼:python

---------------------------------爬取糗事百科段子源碼----------------------------正則表達式

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__author__ = '217小月月坑'

import urllib2
import re

# url:存放url網址的變量
url = 'http://www.qiushibaike.com/'
# user_agent:存放身份識別信息的變量
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Geck
o/20100101 Firefox/40.0'
# 一個headers的字典,headers能夠有不少項,因此要用一個字典來存放
headers = {'User-Agent': user_agent}
'''
req = urllib2.Request(url, headers)
這樣寫是錯誤的,TypeError: must be string or buffer, not dict
'''
'''
爲何要使用headers=headers
緣由:urllib2.Request 有三個參數,url,data,和headers,
若是將全部參數都寫上去的話,能夠直接寫urllib2.Request(url, data, headers)
若是第二個參數不寫的話,要指明第三個參數
'''
# 加入異常處理,注意try,expetc,if語句後面要有冒號
try:
    # 構造一個請求
    req = urllib2.Request(url, headers=headers)
    # 發送請求,獲取返回的數據
    response = urllib2.urlopen(req)
    # 將爬取的網頁源碼存入一個變量中
    content = response.read()
    # 使用compile將正則表達式編譯並存入一個pattern變量中
    # 注:這裏使用了四個正則額表達式,每個表達式獲取一個想要的信息
    pattern = re.compile(r'<h2>(.*?)</h2>.*?'+'<div.*?class="content">
(.*?)<!.*?'+'<div.*?class="stats".*?class="number">(.*?)</i>.*?'+
'<span.*?class="dash".*?class="number">(.*?)</i>.*?',re.S)
    # 使用findall方法按re查找,findall返回的是一個列表
    items = re.findall(pattern,content)
    # 使用for循環遍歷列表中的元素並將它們打印出來
    for item in items:
        print '發佈人:'+item[0]+'\n','段子內容:'+item[1]+'\n','點贊數:'
+item[2]+'\n','評論數:'+item[3]+'\n'
except urllib2.URLError, e:
    if hasattr(e,"code"):
        print e.code
    if hasattr(e,"reason"):
        print e.reason

輸出的結果以下:
url

相關文章
相關標籤/搜索