摘要:紀(jì)念我的第一個(gè)爬蟲程序,一共寫了三個(gè)白天,其中有兩個(gè)上午沒有看,中途遇到了各種奇怪的問題,伴隨著他們的解決,對于一些基本的操作也弄清楚了。我這個(gè)程序想要獲取的是劍來小說,把各個(gè)章節(jié)的內(nèi)容爬去下載存儲(chǔ)到文件里。
紀(jì)念我的第一個(gè)爬蟲程序,一共寫了三個(gè)白天,其中有兩個(gè)上午沒有看,中途遇到了各種奇怪的問題,伴隨著他們的解決,對于一些基本的操作也弄清楚了。果然,對于這些東西的最號(hào)的學(xué)習(xí)方式,就是在使用中學(xué)習(xí),通過解決問題的方式來搞定這些知識(shí)。按需索取,才能更有針對性。
大體記錄下整個(gè)過程。
出于對于python的熱愛,想要嘗試一些練手的項(xiàng)目,但是不論是看書,還是直接嘗試別人的項(xiàng)目,到最后都會(huì)淪為不停地復(fù)制粘貼...最實(shí)際的就是自己來上手親自寫代碼。思路都是一樣的,但是具體的實(shí)現(xiàn)還得靠自己。
以前的復(fù)制粘貼給我的幫助也就是告訴了我大致的流程。
確定目標(biāo)網(wǎng)址目標(biāo)網(wǎng)址是關(guān)鍵。我夢想中的爬蟲是那種偏向于更智能的,直接給他一個(gè)想要獲取的關(guān)鍵詞,一步步的流程直接自己完成,可以自己給定范圍,也可以直接爬取整個(gè)互聯(lián)網(wǎng)或者更實(shí)際的就是整個(gè)百度上的內(nèi)容,但是,目前就我而言,見到的爬蟲,都是給定目標(biāo)網(wǎng)址,通過目標(biāo)頁面上的內(nèi)容進(jìn)一步執(zhí)行規(guī)定的操作,所以現(xiàn)在來看,我們在寫爬蟲之前,需要確定一個(gè)基準(zhǔn)頁面,這個(gè)是需要我們事先制定的。在考慮我們需要程序完成怎樣的功能,獲取頁面文本還是相關(guān)鏈接內(nèi)容還是其他的目的。
我這個(gè)程序想要獲取的是《劍來》小說,把各個(gè)章節(jié)的內(nèi)容爬去下載存儲(chǔ)到文件里。
編程只是實(shí)現(xiàn)目的的工具。
所以重點(diǎn)是分析我們的需求。
獲取小說目錄頁面是基本。這里有各個(gè)章節(jié)的鏈接,標(biāo)題等等內(nèi)容。這是我們需要的。
有了各個(gè)章節(jié)的鏈接,就需要進(jìn)入其中獲得各個(gè)章節(jié)的內(nèi)容。
所以,我們需要獲得頁面內(nèi)容,需要從中獲得目標(biāo)內(nèi)容。
所以使用 urllib.request,re 庫。
前者用來獲得網(wǎng)頁內(nèi)容,后者獲得目標(biāo)信息。
headers直接使用urllib.request的urlopen(),read()方法是會(huì)報(bào)類似以下的錯(cuò)誤(這里是網(wǎng)上查找過來的,都是類似的):
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) HTTPError: HTTP Error 403: Forbidden
出現(xiàn)urllib2.HTTPError: HTTP Error 403: Forbidden錯(cuò)誤是由于網(wǎng)站禁止爬蟲,可以在請求加上頭信息,偽裝成瀏覽器。
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0"} request = url_req.Request(url, headers=headers) response = url_req.urlopen(request, data=None, timeout=3) html = response.read().decode("GBK")
注意:這里存在兩個(gè)容易出問題的地方。
編碼:編碼問題是使用爬蟲中有時(shí)候會(huì)很頭痛的問題,由于網(wǎng)頁源代碼編碼格式不明確,所以這里嘗試了許久。
使用chardet庫的detect()方法可以檢測字節(jié)字符串的編碼。所以直接檢測這里的html(先不要解碼)。輸出的是GB2312,但是在后面頁面的爬取中,會(huì)出現(xiàn)提示有的字符的編碼異常,所以這里采取了比其范圍更廣的中文字符集GBK,解決了這個(gè)問題。
設(shè)置超時(shí)范圍:由于頻繁的獲取網(wǎng)頁內(nèi)容,目標(biāo)網(wǎng)站有時(shí)候會(huì)出現(xiàn)沒有響應(yīng)的問題。
(這個(gè)問題可以見我在CSDN上的提問:關(guān)于python爬蟲程序中途停止的問題)
于是我采取了捕獲 urlopen()的socket.timeout異常,并在出現(xiàn)異常的時(shí)候再循環(huán)訪問,直到獲得目標(biāo)頁面。
獲得目標(biāo)內(nèi)容這里使用的是正則表達(dá)式。re模塊。這里的使用并不復(fù)雜。
首先需要一個(gè)模式字符串。以re.I指定忽略大小寫,編譯后的對象擁有本身匹配的方法,這里使用的是findall(),返回一個(gè)所有結(jié)果組成的列表??梢约皶r(shí)返回輸出其內(nèi)容,進(jìn)而選擇合適的部分進(jìn)行處理。
python 正則表達(dá)式
通過查看相關(guān)的符號(hào),這里使用(.+?)來實(shí)現(xiàn)匹配非貪婪模式(盡量少的)下任意無限字符,對之使用(),進(jìn)而匹配括號(hào)內(nèi)的模式。
文件寫入使用with open() as file:,進(jìn)而可以處理文件。并且可以自動(dòng)執(zhí)行打開和關(guān)閉文件,更為便捷安全。
with open(findall_title[0] + ".txt", "w+", encoding="utf-8") as open_file:
這里也要注意編碼的問題,指定utf-8。會(huì)避免一些問題。
這里使用w+模式,追加寫文件。
完整代碼# -*- coding: utf-8 -*- """ Created on Fri Aug 11 16:31:42 2017 @author: lart """ import urllib.request as url_req import re, socket, time def r_o_html(url): print("r_o_html begin") headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0"} request = url_req.Request(url, headers=headers) NET_STATUS = False while not NET_STATUS: try: response = url_req.urlopen(request, data=None, timeout=3) html = response.read().decode("GBK") print("NET_STATUS is good") print("r_o_html end") return html except socket.timeout: print("NET_STATUS is not good") NET_STATUS = False def re_findall(re_string, operation, html): print("re_findall begin") pattern = re.compile(re_string, re.I) if operation == "findall": result = pattern.findall(html) else: print("this operation is invalid") exit(-1) print("re_findall end") return result if __name__ == "__main__": url_base = "http://www.7kankan.la/book/1/" html = r_o_html(url_base) findall_title = re_findall(r"(.+?) ", "findall", html) findall_chapter = re_findall(r"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/40719.html
摘要:相關(guān)文章一席演講沒有殺死我的朋友紀(jì)念朋友紀(jì)念技術(shù)圈紀(jì)念技術(shù)圈紀(jì)念除馴豬圖,其它照片皆所攝,取自豆瓣 偶然在某公眾號(hào)里看到一篇文章,得知 Vamei 去世的消息。 看到它之前,我并不知道這位知名的 Python 技術(shù)博主。我寫 Python 技術(shù)文章有一小段時(shí)間了,也認(rèn)識(shí)了很多圈內(nèi)的博主。但是,這個(gè) Vamei 是誰呢?竟不認(rèn)識(shí)。我很好奇。 因?yàn)橄⑹菑亩拱昀飩鞒鰜淼?,我就去搜他的豆瓣?..
摘要:相關(guān)文章一席演講沒有殺死我的朋友紀(jì)念朋友紀(jì)念技術(shù)圈紀(jì)念技術(shù)圈紀(jì)念除馴豬圖,其它照片皆所攝,取自豆瓣 偶然在某公眾號(hào)里看到一篇文章,得知 Vamei 去世的消息。 看到它之前,我并不知道這位知名的 Python 技術(shù)博主。我寫 Python 技術(shù)文章有一小段時(shí)間了,也認(rèn)識(shí)了很多圈內(nèi)的博主。但是,這個(gè) Vamei 是誰呢?竟不認(rèn)識(shí)。我很好奇。 因?yàn)橄⑹菑亩拱昀飩鞒鰜淼模揖腿ニ阉亩拱辍?..
摘要:責(zé)編現(xiàn)代化的方式開發(fā)一個(gè)圖片上傳工具前端掘金對于圖片上傳,大家一定不陌生。之深入事件機(jī)制前端掘金事件綁定的方式原生的事件綁定方式有幾種想必有很多朋友說種目前,在本人目前的研究中,只有兩種半兩種半還有半種的且聽我道來。 Ajax 與數(shù)據(jù)傳輸 - 前端 - 掘金背景 在沒有ajax之前,前端與后臺(tái)傳數(shù)據(jù)都是靠表單傳輸,使用表單的方法傳輸數(shù)據(jù)有一個(gè)比較大的問題就是每次提交數(shù)據(jù)都會(huì)刷新頁面,用...
閱讀 2673·2023-04-26 02:44
閱讀 8755·2021-11-22 14:44
閱讀 2133·2021-09-27 13:36
閱讀 2539·2021-09-08 10:43
閱讀 693·2019-08-30 15:56
閱讀 1402·2019-08-30 15:55
閱讀 2897·2019-08-28 18:12
閱讀 2841·2019-08-26 13:50