假如我們想爬取糗事百科(http://www.qiushibaike.com/)上的段子,今天的Demo如下:
import re
import urllib.request
#爬取頁(yè)面鏈接
def get_content(url,page):
? ? # 模擬成瀏覽器
? ? headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.4882.400 QQBrowser/9.7.13059.400")
? ? opener = urllib.request.build_opener()
? ? opener.addheaders = [headers]
? ? # 將opener安裝為全局
? ? urllib.request.install_opener(opener)
? ? html_info = urllib.request.urlopen(url).read().decode("utf-8")
? ? #構(gòu)建對(duì)應(yīng)用戶提取的正則表達(dá)式,要根據(jù)網(wǎng)站實(shí)際情況改變
? ? # 構(gòu)建段子內(nèi)容提取的正則表達(dá)式
? ? content_pat = '
? ? # 尋找出所有的用戶
? ? user_list = re.compile(user_pat, re.S).findall(html_info)
? ? # 尋找出所有的內(nèi)容
? ? cotent_list = re.compile(content_pat, re.S).findall(html_info)
? ? # 通過for循環(huán)遍歷段子內(nèi)容并將內(nèi)容分別賦給對(duì)應(yīng)的變量
? ? x = 1
? ? for content in cotent_list:
? ? ? ? content = content.replace("\n", "")
? ? ? ? # 用字符串作為變量名,先將對(duì)應(yīng)字符串賦給一個(gè)變量
? ? ? ? name = "content" + str(x)
? ? ? ? # 通過exec()函數(shù)實(shí)現(xiàn)用字符串作為變量名并賦值
? ? ? ? exec(name+'=content')
? ? ? ? x += 1
? ? y = 1
? ? # 通過for循環(huán)遍歷用戶,并輸出該用戶對(duì)應(yīng)的內(nèi)容
? ? for user in user_list:
? ? ? ? name = "content" + str(y)
? ? ? ? print("用戶" + str(page) + str(y) + "是:" + user)
? ? ? ? print("內(nèi)容是:")
? ? ? ? exec("print("+name+")")
? ? ? ? print("\n")
? ? ? ? y += 1
#分別獲取各頁(yè)的段子,通過for循環(huán)可以獲取多頁(yè)
for i in range(1, 10):
? ? # https://www.qiushibaike.com/8hr/page/5/
? ? url = "https://www.qiushibaike.com/8hr/page/" + str(i)
? ? get_content(url, i)
爬蟲的原理基本都是相同的,主要不同體現(xiàn)在數(shù)據(jù)的過濾,也就是正則表達(dá)式的不同,所以我們需要觀察網(wǎng)頁(yè)代碼的特性,取出所需的內(nèi)容,然后再進(jìn)行篩選,組合。