摘要:如果有人有興趣的話,可以編寫(xiě)則個(gè)下面,我會(huì)說(shuō)明在編寫(xiě)爬蟲(chóng)過(guò)程中的所思所想。文章讀取完畢最后,還要再編寫(xiě)一個(gè)語(yǔ)句,判斷是運(yùn)行還是導(dǎo)入。文章結(jié)束前的一些話嗯,本文到這里就結(jié)束了。
今天,根據(jù)網(wǎng)頁(yè)的結(jié)構(gòu),嘗試了下如何抓取煎蛋首頁(yè)上的文章。目標(biāo)很簡(jiǎn)單:
根據(jù)首頁(yè)上面的文章鏈接,載入文章,而后將文章的標(biāo)題和正文(不帶圖片)抓取下來(lái)。
抓取首頁(yè)上面文章的鏈接,標(biāo)題,作者和所屬標(biāo)簽。
按標(biāo)題將文章寫(xiě)入一個(gè).txt格式的文件
將首頁(yè)上抓取的內(nèi)容整合起來(lái),制作成格式如下的Markdown簡(jiǎn)介。
首頁(yè)的簡(jiǎn)介格式如下:
**文章標(biāo)題**:鯨魚(yú)有鯨語(yǔ),鯨語(yǔ)有口音 **文章鏈接**:[http://jandan.net/2016/02/18/caribbean-whales.html](http://jandan.net/2016/02/18/caribbean-whales.html) **譯者**:Cedric **標(biāo)簽**:走進(jìn)科學(xué) ...
如此反復(fù)即可。這里要說(shuō)明下,由于煎蛋首頁(yè)和余下頁(yè)碼的網(wǎng)頁(yè)結(jié)構(gòu)不同,我沒(méi)有再寫(xiě)余下頁(yè)面的簡(jiǎn)介。如果有人有興趣的話,可以編寫(xiě)則個(gè)~下面,我會(huì)說(shuō)明在編寫(xiě)爬蟲(chóng)過(guò)程中的所思所想。
1. 爬蟲(chóng)前的準(zhǔn)備我這里使用了Python中的以下模塊:
beautifulsoup:第三方模塊,用于解析網(wǎng)頁(yè)內(nèi)容。
requests:第三方模塊,用于獲取網(wǎng)頁(yè)內(nèi)容。
re:內(nèi)置模塊,用于編寫(xiě)正則表達(dá)式
codecs:內(nèi)置模塊,用于操作文件
這便是全部準(zhǔn)備了。在這里要多嘴一句,包括re模塊在內(nèi)都存在替代品,如果需要可以根據(jù)自己的喜好來(lái)選擇。
2. 分析程序邏輯在編寫(xiě)代碼之前,要分析如何抓取并處理網(wǎng)頁(yè)。以抓取一篇文章鯨魚(yú)有鯨語(yǔ),鯨語(yǔ)有口音為例。我們要實(shí)現(xiàn):
下載網(wǎng)頁(yè),獲取數(shù)據(jù)——源代碼或者json數(shù)據(jù)
解析數(shù)據(jù),從數(shù)據(jù)中抽出我們需要的內(nèi)容——這里是文章標(biāo)題和文章內(nèi)容(只有文字)
整理數(shù)據(jù),將解析好的數(shù)據(jù)寫(xiě)入文件中。
這樣,可以根據(jù)實(shí)現(xiàn)的內(nèi)容,將代碼分為三個(gè)部分,用函數(shù)來(lái)整合:
download_page(url):接受一個(gè)URL(通常是網(wǎng)址),下載網(wǎng)頁(yè),而后獲取數(shù)據(jù)(當(dāng)然,不止下載網(wǎng)頁(yè)而已,還有很多內(nèi)容,但對(duì)于現(xiàn)在來(lái)說(shuō),這么講就好)
parse_article(data):接受上面的函數(shù)返回的data,并解析為我們需要的內(nèi)容
write_article(title, content):接受上面的函數(shù)返回的標(biāo)題和文章內(nèi)容,并寫(xiě)入文件中。
這三個(gè)部分中,現(xiàn)在我感覺(jué)最難的是其中的parse_article(data)。當(dāng)然,一部分是因?yàn)槲业慕?jīng)驗(yàn)不足,經(jīng)常要花很長(zhǎng)時(shí)間才找到需要的內(nèi)容。這里,推薦讀者在瀏覽器中使用右鍵——查找元素來(lái)輔助解析網(wǎng)頁(yè)。
當(dāng)明白怎么爬取一篇文章的時(shí)候,爬取其他內(nèi)容就是一些細(xì)節(jié)上的事情了。細(xì)節(jié)上的內(nèi)容可以通過(guò)模塊的文檔來(lái)獲取。我提到的兩個(gè)第三方模塊的中文資料都比較豐富(百度一下即可),所以不再贅述。這里只說(shuō)明幾個(gè)需要注意下的細(xì)節(jié):
在發(fā)送請(qǐng)求的時(shí)候,網(wǎng)頁(yè)可能會(huì)通過(guò)檢查頭信息中的User-Agent來(lái)判斷是否是一個(gè)人瀏覽網(wǎng)頁(yè)。最簡(jiǎn)單的解決問(wèn)題的方法就是自己寫(xiě)一個(gè)頭信息,偽裝成一個(gè)人。
如果抓取的頻率過(guò)快,可能會(huì)被服務(wù)器拒絕訪問(wèn),如果IP被封了就完了。這里有兩個(gè)解決問(wèn)題的思路:
使用IP代理,輪換IP訪問(wèn)網(wǎng)頁(yè)
設(shè)置一個(gè)簡(jiǎn)單的爬蟲(chóng)測(cè)試服務(wù)器可以接受的訪問(wèn)頻率,從慢而快的訪問(wèn)網(wǎng)頁(yè)。(就是看服務(wù)器的忍受程度是多少)
網(wǎng)頁(yè)上通常不止有一個(gè)地方包含了我們所需的內(nèi)容(比如有兩個(gè)塊可以實(shí)現(xiàn)下一頁(yè)的功能),所以,一個(gè)塊難解析可以使用另一個(gè)塊,變通下嘛~
3. 爬蟲(chóng)實(shí)例這里以抓取一篇文章鯨魚(yú)有鯨語(yǔ),鯨語(yǔ)有口音為例。剛才提到了,要實(shí)現(xiàn)三個(gè)函數(shù):
download_page(url)
parse_article(data)
write_article(title, content)
3.1 下載數(shù)據(jù)首先是第一個(gè)函數(shù)download_page(url)。由于內(nèi)容單一,所以實(shí)現(xiàn)比較簡(jiǎn)單(要注意的是,這里需要準(zhǔn)備一些防反爬蟲(chóng)的措施)。下面將展示如何偽裝成一個(gè)瀏覽器下載網(wǎng)頁(yè)或者其中的數(shù)據(jù):
def download_page(url): headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) " "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36" } data = requests.get(url, headers=headers).content return data
我們這里偽裝了一個(gè)火狐瀏覽器。這個(gè)信息不需要你輸入或者從這里復(fù)制,如果需要的話,可以在瀏覽器中右鍵——查看元素——網(wǎng)絡(luò)而后就可以查看消息頭并偽裝成你自己的瀏覽器了。我們這里使用的HTTP請(qǐng)求中的get方法,如果有看過(guò)之前的內(nèi)容(指HTTP權(quán)威指南的一部分),就可以明白這里是什么意思啦~
3.2 解析數(shù)據(jù)下面是第二個(gè)函數(shù)parse_article(data),內(nèi)容比較復(fù)雜,而且是根據(jù)我們要爬取的文章頁(yè)面制定的。我們首先放到文章的主體上,右鍵——查看元素,可以看到主體的部分結(jié)構(gòu)是這樣的:
嗯,可以明白(如果不明白的話,請(qǐng)自己補(bǔ)習(xí)HTML的基礎(chǔ)知識(shí)。這部分在Segmantfault里面搜集即可)文章的主體部分在 標(biāo)簽的內(nèi)容。 據(jù)此,我們可以使用beatifulsoup來(lái)實(shí)現(xiàn)我們的第二個(gè)函數(shù): 標(biāo)簽內(nèi)的文本,這里就是段落文本內(nèi)容。
paras.append(p_content)
return title, paras
# 返回標(biāo)題和參數(shù),用于寫(xiě)入文件。 獲取我們需要的所有數(shù)據(jù)(標(biāo)題和內(nèi)容)以后,需要將其寫(xiě)入文件中。我們首先需要拼接一個(gè)文件名,創(chuàng)建并打開(kāi)文件。這里要注意參數(shù)wb。在Python3.X中,b參數(shù)是自動(dòng)添加的(如果沒(méi)有寫(xiě)則會(huì)填上去,有的話就不會(huì)自己填上去);但是在Python2.X中不是這樣,所以最好填上去,避免換了版本以后出現(xiàn)一些奇怪的Bug。當(dāng)然,不換也行~ 最后,還要再編寫(xiě)一個(gè)if語(yǔ)句,判斷是運(yùn)行還是導(dǎo)入。運(yùn)行文件的時(shí)候,可以通過(guò)調(diào)用第三個(gè)函數(shù)來(lái)實(shí)現(xiàn)我們的目的。 嗯,本文到這里就結(jié)束了。下面還有抓取簡(jiǎn)單首頁(yè)文章的爬蟲(chóng)。不過(guò)爬取的過(guò)程也是上面的幾步,如果看懂的話,就可以編寫(xiě)出來(lái)??床欢脑挕?,其實(shí)我只是因?yàn)殚_(kāi)心想炫耀一下,哈哈哈哈來(lái)打我啊~~ 我是胡一波,集帥氣與智慧于一身的美男子,每天都被自己帥醒。如果各位發(fā)現(xiàn)這些代碼有問(wèn)題的話,請(qǐng)跟我說(shuō),我會(huì)盡快回復(fù)并發(fā)送一塊錢(qián)!這些錢(qián)可以指定給任意人或者機(jī)構(gòu)(比如慈善組織和開(kāi)源項(xiàng)目),就醬~ 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37747.htmldef parse_article(html):
soup = BeautifulSoup(html, "html.parser")
# 從上面的數(shù)據(jù)獲取html文檔并解析,這里使用的是Python自帶的HTML解釋器
article = soup.find("div", attrs={"class": "post f"})
# 縮小HTML文檔的解析范圍,限定在文章主體內(nèi)部。
title = article.find("h1").getText()
# 獲取文章主體內(nèi)部的
3.3 整理數(shù)據(jù)
標(biāo)簽內(nèi)的文本,可以發(fā)現(xiàn)這就是標(biāo)題內(nèi)容。
paras = []
# 創(chuàng)建一個(gè)列表,以段落的形式,向里面填充文本。
for paragraph in article.find_all("p"):
p_content = paragraph.getText()
# 獲取
def get_article(title, url):
file_name = title + ".txt"
# 拼接文件名
with codecs.open(file_name, "wb", encoding="utf-8") as fp:
html = download_page(url)
# 調(diào)用第一個(gè)函數(shù)獲取數(shù)據(jù)
title2, text = parse_article(html)
# 調(diào)用第二個(gè)函數(shù)獲取數(shù)據(jù)
fp.write(" %s
" % title2)
for p in text:
fp.write(" %s
" % p)
# 將獲取的數(shù)據(jù)寫(xiě)入文件。
print("文章讀取完畢!")
return "OK"
if __name__ == "__main__":
url = "http://jandan.net/2016/02/18/caribbean-whales.html"
get_article(url)
4. 文章結(jié)束前的一些話
摘要:關(guān)于在大一這年的所學(xué)在上學(xué)期中一對(duì)的初步看法因?yàn)樽约簩?duì)軟件專(zhuān)業(yè)有了一定的興趣讓我踏進(jìn)了這個(gè)校園。當(dāng)你完成一段代碼或者說(shuō)一個(gè)項(xiàng)目時(shí)那種成就感真的是不言而喻了妙不可言。 ...
摘要:對(duì)于膽子小的人來(lái)說(shuō),什么未知情況都會(huì)害怕,這感覺(jué)真讓人討厭。遠(yuǎn)程服務(wù)器找到資源并使用響應(yīng)返回該資源,值為的響應(yīng)狀態(tài)表示一個(gè)正確的響應(yīng)。 最近事好多,心好累。對(duì)于膽子小的人來(lái)說(shuō) ,什么未知情況都會(huì)害怕,這感覺(jué)真讓人討厭。 知識(shí)點(diǎn) 一個(gè)頁(yè)面從輸入 URL 到頁(yè)面加載顯示完成,這個(gè)過(guò)程中都發(fā)生了什么? 分為4個(gè)步驟: (1),當(dāng)發(fā)送一個(gè)URL請(qǐng)求時(shí),不管這個(gè)URL是Web頁(yè)面的URL還是We...
摘要:前言在網(wǎng)站頁(yè)面后端渲染的時(shí)代,開(kāi)發(fā)者只需要按照規(guī)范制作搜索引擎友好的頁(yè)面便可以快速讓搜索引擎收錄自己網(wǎng)站的各個(gè)頁(yè)面。 前言 在網(wǎng)站頁(yè)面后端渲染的時(shí)代,開(kāi)發(fā)者只需要按照規(guī)范制作搜索引擎友好的頁(yè)面便可以快速讓搜索引擎收錄自己網(wǎng)站的各個(gè)頁(yè)面。 隨著前后端技術(shù)的更新,越來(lái)越多的前端框架進(jìn)入開(kāi)發(fā)者們的視野,網(wǎng)站的前后分離架構(gòu)越來(lái)越得到開(kāi)發(fā)者們的喜愛(ài)與認(rèn)可。 后端只提供數(shù)據(jù)接口、業(yè)務(wù)邏輯與持久化服...
摘要:前言在網(wǎng)站頁(yè)面后端渲染的時(shí)代,開(kāi)發(fā)者只需要按照規(guī)范制作搜索引擎友好的頁(yè)面便可以快速讓搜索引擎收錄自己網(wǎng)站的各個(gè)頁(yè)面。 前言 在網(wǎng)站頁(yè)面后端渲染的時(shí)代,開(kāi)發(fā)者只需要按照規(guī)范制作搜索引擎友好的頁(yè)面便可以快速讓搜索引擎收錄自己網(wǎng)站的各個(gè)頁(yè)面。 隨著前后端技術(shù)的更新,越來(lái)越多的前端框架進(jìn)入開(kāi)發(fā)者們的視野,網(wǎng)站的前后分離架構(gòu)越來(lái)越得到開(kāi)發(fā)者們的喜愛(ài)與認(rèn)可。 后端只提供數(shù)據(jù)接口、業(yè)務(wù)邏輯與持久化服...
摘要:我是布小禪,一枚自學(xué)萌新,跟著我每天進(jìn)步一點(diǎn)點(diǎn)吧說(shuō)了這么多暫時(shí)也就夠了,那么就告辭吧 文章目錄 ?? 前言 ??? 作者簡(jiǎn)介 ??文件操作?1??、open函數(shù)...
閱讀 2159·2023-04-26 00:38
閱讀 1943·2021-09-07 10:17
閱讀 896·2021-09-02 15:41
閱讀 646·2021-08-30 09:45
閱讀 550·2019-08-29 17:25
閱讀 3219·2019-08-29 15:07
閱讀 2199·2019-08-29 12:52
閱讀 3742·2019-08-26 13:35