requests與BeautifulSoup基礎(chǔ)入門
1. 前言
最近在學(xué)習(xí)python爬蟲,以前實(shí)現(xiàn)python爬蟲,主要是使用較為底層的urllib和urllib2來(lái)實(shí)現(xiàn)的瓷患,這種方法最原始,編碼起來(lái)也比較困難。而采用requests + BeautifulSoup的實(shí)現(xiàn)方案疤孕,可以簡(jiǎn)化代碼的書寫。如果有不好和錯(cuò)誤的地方希望大佬指出央拖。
2. 介紹
- 在使用這兩個(gè)模塊之前胰柑,需要對(duì)這兩個(gè)模塊做一些介紹:requests是基于urllib,采用 Apache2 Licensed 開(kāi)源協(xié)議的 HTTP 庫(kù)爬泥,比 urllib 更加方便柬讨。BeautifulSoup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù),實(shí)際上袍啡,它將html中的tag作為樹(shù)節(jié)點(diǎn)進(jìn)行解析踩官。
- requests官方文檔:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
- BeautifulSoup官方文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
3. 實(shí)現(xiàn)代碼
首先是引入這2個(gè)庫(kù),這里我使用的是PyCharm編輯器境输,通過(guò)Settings→Project: WorkSpace→Project Interpreter尋找bs4和requests庫(kù)蔗牡。pip方法引入第三方庫(kù)請(qǐng)自行百度颖系。
先從最簡(jiǎn)單的開(kāi)始,點(diǎn)進(jìn)糗事百科首頁(yè)
import requests # 導(dǎo)入requests模塊
res = requests.get("http://www.qiushibaike.com") # 獲取糗事百科首頁(yè)
print (res.text) # print(res)打印的是響應(yīng)碼辩越,print(res.text)打印的是首頁(yè)的源代碼
得到頁(yè)面源碼嘁扼,如果發(fā)現(xiàn)頁(yè)面文字是亂碼,則是編碼的原因黔攒,輸出頁(yè)面的編碼
print (res.encoding)
如果不是UTF-8趁啸,可以設(shè)置為UTF-8
res.encoding = "utf-8"
點(diǎn)進(jìn)一篇文章,按F12進(jìn)入開(kāi)發(fā)者工具督惰,按住ctrl+shift+c或者是點(diǎn)擊左上角的剪頭選中頁(yè)面中的文章
發(fā)現(xiàn)其class是content
# 獲取文章內(nèi)容
import requests
from bs4 import BeautifulSoup
res = requests.get("https://www.qiushibaike.com/article/119567920")
soup = BeautifulSoup(res.text, "html.parser") # 把我們需要的內(nèi)容放到BeautifulSoup中不傅,html.parser是一個(gè)解析器
div = soup.find_all(class_="content")[0] # 找尋class為content的內(nèi)容
print(div.text.strip()) # 輸出文章內(nèi)容
如果要獲取首頁(yè)一頁(yè)的文章內(nèi)容,則通過(guò)開(kāi)發(fā)者工具查看首頁(yè)赏胚,發(fā)現(xiàn)每個(gè)文章的頁(yè)面class為article block untagged mb15 typs_xxxx
用re來(lái)匹配各種文章的class访娶。
Python3正則表達(dá)式:http://www.runoob.com/python3/python3-reg-expressions.html
# 獲取所有文章的內(nèi)容
import requests
from bs4 import BeautifulSoup
import re
res = requests.get("http://www.qiushibaike.com")
soup = BeautifulSoup(res.text, "html.parser")
divs = soup.find_all(class_=re.compile(r'article block untagged mb15 typs_(\w*)')) # 所有文章是一個(gè)數(shù)組
for div in divs: # 循環(huán)取出
joke = div.span.get_text()
print(joke.strip())
print("------")
輸出內(nèi)容后發(fā)現(xiàn)有些內(nèi)容讀起來(lái)很奇怪,看頁(yè)面發(fā)現(xiàn)有些是有圖片的觉阅,圖片的網(wǎng)頁(yè)標(biāo)簽(HTML tag)是img崖疤。
所以我們要把有圖片的文章過(guò)濾掉,發(fā)現(xiàn)有圖片文章有個(gè)class為thumb典勇,則我們把有圖片的過(guò)濾掉
# 獲取一頁(yè)沒(méi)有圖片的文章
import requests
from bs4 import BeautifulSoup
import re
res = requests.get("http://www.qiushibaike.com")
soup = BeautifulSoup(res.text, "html.parser")
divs = soup.find_all(class_=re.compile(r'article block untagged mb15 typs_(\w*)')) # 匹配class
for div in divs:
if div.find_all(class_="thumb"): # 如果有圖片則過(guò)濾
continue
joke = div.span.get_text()
print(joke.strip())
print("------")
但是糗事百科有很多頁(yè)劫哼,點(diǎn)擊第二頁(yè)發(fā)現(xiàn)網(wǎng)址為:https://www.qiushibaike.com/8hr/page/2/ ,點(diǎn)擊第三頁(yè)發(fā)現(xiàn)網(wǎng)址為:https://www.qiushibaike.com/8hr/page/3 痴柔,所以我們只需要將網(wǎng)址最后的數(shù)字變動(dòng)即可得到其他頁(yè)面
# 獲取前幾頁(yè)的文章
import requests
from bs4 import BeautifulSoup
import re
base_url = "https://www.qiushibaike.com/8hr/page/"
for num in range(1, 3): # 設(shè)置循環(huán)沦偎,讓num分別等于1-3,獲取前3頁(yè)內(nèi)容
print('第{}頁(yè):'.format(num))
res = requests.get(base_url + str(num)) # 這里對(duì)網(wǎng)址后面加上數(shù)字
soup = BeautifulSoup(res.text, "html.parser")
divs = soup.find_all(class_=re.compile(r'article block untagged mb15 typs_(\w*)'))
for div in divs:
if div.find_all(class_="thumb"):
continue
joke = div.span.get_text()
print(joke.strip())
print("------")
print("\n\n\n\n\n\n\n")