爬取糗百內(nèi)容
GitHub 代碼地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py
微信公眾號(hào):【智能制造社區(qū)】室囊,歡迎關(guān)注镰吵。
本文目標(biāo)
- 掌握爬蟲的基本概念
- Requests 及 Beautiful Soup 兩個(gè) Python 庫(kù)的基本使用
- 通過(guò)以上知識(shí)完成糗百段子抓取
爬蟲基本概念
爬蟲也稱網(wǎng)頁(yè)蜘蛛,主要用于抓取網(wǎng)頁(yè)上的特定信息剧罩。這在我們需要獲取一些信息時(shí)非常有用袜腥,比如我們可以批量到美圖網(wǎng)站下載圖片,批量下載段子。省去手工操作的大量時(shí)間槐沼。爬蟲程序一般是通過(guò)模擬瀏覽器對(duì)相應(yīng)URL發(fā)出請(qǐng)求,獲取數(shù)據(jù)捌治,并通過(guò)正則等手段匹配出頁(yè)面中我們所需的數(shù)據(jù)岗钩。
在學(xué)習(xí)爬蟲之前,最好到 w3school 去了解一下 HTML 標(biāo)簽的概念以及基本的 CSS 的概念肖油。這會(huì)讓我們更容易的理解如何獲取頁(yè)面中某個(gè)內(nèi)容兼吓。
Requests 庫(kù)基本介紹
Requests 是學(xué)習(xí)爬蟲的一大利器。是一個(gè)優(yōu)雅簡(jiǎn)單的 HTTP庫(kù)森枪。官網(wǎng)介紹如下:
Requests: HTTP for Humans
專門為人類使用的 HTTP 庫(kù)视搏。使用起來(lái)非常簡(jiǎn)單明了。
我們平時(shí)瀏覽網(wǎng)頁(yè)的步驟是輸入網(wǎng)址县袱,打開浑娜。在 Requests 中是如下這樣的,我們可以在 Python 交互式解釋器中輸入以下代碼:
import requests
r = requests.get('https://www.qiushibaike.com/text/') # 打開網(wǎng)址显拳,一般我們會(huì)設(shè)置 請(qǐng)求頭棚愤,來(lái)更逼真的模擬瀏覽器,下文有介紹
r.text
我門看到下面一堆的代碼杂数,其實(shí)就是網(wǎng)頁(yè)的源代碼(也可以在瀏覽器上右鍵查看頁(yè)面源代碼)宛畦。通過(guò)這幾行代碼我們就拿到了頁(yè)面的所有信息,剩下的就是從頁(yè)面中找到我們所需要的信息揍移。
Beautiful Soup 庫(kù)介紹
拿到網(wǎng)頁(yè)信息后次和,我們要解析頁(yè)面,通常來(lái)說(shuō)我們有以下幾種方式來(lái)解析頁(yè)面那伐,獲取我們所需的信息踏施。
- 正則表達(dá)式
- 適用于簡(jiǎn)單數(shù)據(jù)的匹配,如果匹配內(nèi)容較復(fù)雜罕邀,正則表達(dá)式寫起來(lái)會(huì)很繞畅形,同時(shí)頁(yè)面內(nèi)容稍微變化,正則就會(huì)失效
- Lxml
- Lxml 是專門用來(lái)解析 XML 格式文件的庫(kù)诉探,該模塊用 C 語(yǔ)言編寫日熬,解析速度很快,和正則表達(dá)式速度差不多肾胯,但是提供了 XPath 和 CSS 選擇器等定位元素的方法
- Beautiful Soup
- 這是一個(gè) Python 實(shí)現(xiàn)的解析庫(kù)竖席,相比較于前兩種來(lái)說(shuō)耘纱,語(yǔ)法會(huì)更簡(jiǎn)單明了一點(diǎn),文檔也比較詳細(xì)毕荐。唯一的一點(diǎn)就是運(yùn)行速度比前兩種方式慢幾倍束析,當(dāng)數(shù)據(jù)量非常大時(shí)相差會(huì)更多。
本文作為入門教程憎亚,就從 Beautiful Soup 入手员寇,來(lái)學(xué)習(xí)一下匹配頁(yè)面所需元素的方法。
假如有以下 HTML 內(nèi)容 example.html
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
</head>
<body>
<div class='main-page'>
<ul class='menu-list'>
<li>首頁(yè)</li>
<li>新聞</li>
<li>影視</li>
</ul>
</div>
</body>
</html>
我們通過(guò) Beautiful Soup 來(lái)解析這個(gè) html. 首先我們pip install beautifulsoup4
安裝這個(gè)庫(kù)虽填,并看一下簡(jiǎn)單使用丁恭。
>>>from bs4 import BeautifulSoup
>>>soup = BeautifulSoup('example.html', 'html.parser') #加載我們的html文件
>>>soup.find('div') # 找到 div 標(biāo)簽
'<div class="main-page">
<ul class="menu-list">
<li>首頁(yè)</li>
<li>新聞</li>
<li>影視</li>
</ul>
</div>'
>>>soup.find_all('li') # 找到所有 li 標(biāo)簽
'[<li>首頁(yè)</li>, <li>新聞</li>, <li>影視</li>]'
>>>for i in li:
print(i.text) #獲取每個(gè) li 標(biāo)簽的內(nèi)容
'
首頁(yè)
新聞
影視
'
詳細(xì)的操作可以去看一下文檔,文檔非常詳細(xì)斋日,例子也很多牲览,簡(jiǎn)單明了。
糗百爬蟲代碼
我們先爬取純文本的內(nèi)容 https://www.qiushibaike.com/text/ 爬取這個(gè)鏈接下的內(nèi)容恶守。我們把頁(yè)面結(jié)構(gòu)截圖如下第献,我們要獲取的信息,我用紅色的方框進(jìn)行了標(biāo)注兔港。
圖一:
圖二:
import requests
from bs4 import BeautifulSoup
def download_page(url):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
r = requests.get(url, headers=headers) # 增加headers, 模擬瀏覽器
return r.text
def get_content(html, page):
output = """第{}頁(yè) 作者:{} 性別:{} 年齡:{} 點(diǎn)贊:{} 評(píng)論:{}\n{}\n------------\n""" # 最終輸出格式
soup = BeautifulSoup(html, 'html.parser')
con = soup.find(id='content-left') # 如圖一紅色方框
con_list = con.find_all('div', class_="article") # 找到文章列表
for i in con_list:
author = i.find('h2').string # 獲取作者名字
content = i.find('div', class_='content').find('span').get_text() # 獲取內(nèi)容
stats = i.find('div', class_='stats')
vote = stats.find('span', class_='stats-vote').find('i', class_='number').string
comment = stats.find('span', class_='stats-comments').find('i', class_='number').string
author_info = i.find('div', class_='articleGender') # 獲取作者 年齡庸毫,性別
if author_info is not None: # 非匿名用戶
class_list = author_info['class']
if "womenIcon" in class_list:
gender = '女'
elif "manIcon" in class_list:
gender = '男'
else:
gender = ''
age = author_info.string # 獲取年齡
else: # 匿名用戶
gender = ''
age = ''
save_txt(output.format(page, author, gender, age, vote, comment, content))
def save_txt(*args):
for i in args:
with open('qiubai.txt', 'a', encoding='utf-8') as f:
f.write(i)
def main():
# 我們點(diǎn)擊下面鏈接,在頁(yè)面下方可以看到共有13頁(yè)衫樊,可以構(gòu)造如下 url飒赃,
# 當(dāng)然我們最好是用 Beautiful Soup找到頁(yè)面底部有多少頁(yè)。
for i in range(1, 14):
url = 'https://qiushibaike.com/text/page/{}'.format(i)
html = download_page(url)
get_content(html, i)
if __name__ == '__main__':
main()
運(yùn)行代碼后科侈,我們會(huì)得到 'qiubai.txt'文件载佳,打開后如下所示