
Python中有關網頁操作的標准庫有很多
這次使用三個流行的bs4庫、requests_html庫和lxml庫的方法,在你需要在自己的程序中插入指定網頁的指定容器的內容時,可以插入下面的內容,因為你需要的信息可能是一直在變動的。缺點是如果網站運營者改動了網頁的分支結構,這段代碼就會出錯,但是一般來說,大公司的網站結構一般不會隨意改變,畢竟改進一次web結構,意味着底層碼農需要重新學一次搬磚技巧。
比如說我們爬取https://python123.io/index中專欄后面的這行小字,這很顯然是個靜態的文字,爬取它不容易出錯。
1.BeautifulSoup().select()方法
在這之前,我們要通過強大的CSS選擇器獲取這個特定元素,以Chrome為例:
from bs4 import BeautifulSoup
import requests
url = 'https://python123.io/index'
response = requests.get(url)
response.encoding=response.apparent_encoding
#因為網站使用的不是通用的utf-8格式,而是gzip,所以要讓它判斷解碼格式
html = BeautifulSoup(response.text,'lxml')
#獲取到的網頁信息需要進行解析,使用lxml解析器,其實默認的解析器就是lxml,但是這里會出現警告提示,方便你對其他平台移植
content=html.select('#links > div:nth-child(1) > div.main > div > div.landing.is-clipped > div:nth-child(2) > div:nth-child(1) > h4:nth-child(6) > span')
#將復制好的選擇器信息放進select方法中,將獲取到的內容作為tag形式放入一個列表中
print(content[0].get_text())
#打印這個列表中第一個內容,就是我們要獲得的信息
輸出結果為:向別人清楚講述,是更有效率的學習方式!開設專欄,分享你的所學所得。
2.HTMLSession.get().html.find()方法
from requests_html import HTMLSession
session=HTMLSession()
url=session.get('https://python123.io/index')
content=url.html.find('#links > div:nth-child(1) > div.main > div > div.landing.is-clipped > '
'div:nth-child(2) > div:nth-child(1) > h4:nth-child(6) > span',first=True)
#將選擇器信息作為find方法中第一個參數鍵入,加上first參數,值為Ture
print(content.text)
#輸出requests_html的元素的文本屬性,得到目標文本(content變量類型為requests_html.Element)
輸出結果為:向別人清楚講述,是更有效率的學習方式!開設專欄,分享你的所學所得。
3.etree.HTML().xpath()方法

注意看對應的這段網頁源代碼,它是在span標簽中,並且這個標簽的class類名叫is-text-small is-text-grey,我們就用這個方法來直接匹配這個標簽就可以得到信息了。
這個方法前半部分和第一個方法一樣,嘻嘻,所以內容就輕易獲取到了。
from lxml import etree
import requests
url = 'https://python123.io/index'
response = requests.get(url)
response.encoding=response.apparent_encoding
label=etree.HTML(response.text)
#提取這個頁面中所有的標簽信息
content=label.xpath('//span[@class="is-text-small is-text-grey"]/text()')
#提取span標簽中class名為"is-text-small is-text-grey"的內容信息,並且存入一個列表中
print(content[0])
#打印獲得的文本信息
輸出結果為:向別人清楚講述,是更有效率的學習方式!開設專欄,分享你的所學所得。
總結
至此,兩種方法都爬取到了指定的文本信息,但是這樣的爬蟲既不能保證網站結構不改變,又不能保證不會被作為惡意爬蟲被反爬,也不能保證被作為頻繁的機器操作被屏蔽IP。
所以,在后續的博客中,我們嘗試加入更健壯的爬蟲方法,並且在訪問時加入瀏覽器標頭,以及使用動態IP去訪問網址。
但是,無論如何,你的爬蟲必須都遵從三點:
- 程序必須具有類人一樣操作,不能利用計算機強大的計算能力,惡意頻繁訪問網站,給網站造成巨大的壓力。所以,在編寫爬蟲時對其訪問速度加以限制,以免對網站服務器帶來巨大的資源開銷。
- 法律准則:
(1)2017年6月1日起施行的《中華人民共和國網絡安全法》規定:任何個人和組織不得竊取或者以其他非法方式獲取個人信息,不得非法出售或者非法向他人提供個人信息。
(2)爬取數據過程中不應侵犯他人的知識產權。 - 遵循Robots協議:
查看網站的robots文件:網站主域名+"/robots.txt"
比如要查看百度的robots協議,則在網址處輸入"https://www.baidu.com/robots.txt"
具體參考網絡爬蟲的行為准則
