摘要:簡(jiǎn)介爬蟲這個(gè)東西我就不多做介紹了,總之是一個(gè)很好用的爬蟲庫(kù),且關(guān)于也有較多的教程。這篇文章記錄一下我個(gè)人的項(xiàng)目規(guī)劃和天坑心得。然后執(zhí)行就會(huì)自動(dòng)去爬數(shù)據(jù)了。常用配置這里要結(jié)合一些原因來進(jìn)行說明。
簡(jiǎn)介
scrapy爬蟲這個(gè)東西我就不多做介紹了,總之是一個(gè)很好用的Python爬蟲庫(kù),且關(guān)于scrapy也有較多的教程。這篇文章記錄一下我個(gè)人的項(xiàng)目規(guī)劃和天坑心得。
通常來說,我們執(zhí)行了scrapy startproject example后就會(huì)創(chuàng)建這樣的一個(gè)文件結(jié)構(gòu),大致如下:
├── example │?? ├── __init__.py │?? ├── __pycache__ │?? ├── items.py │?? ├── middlewares.py │?? ├── pipelines.py │?? ├── settings.py │?? └── spiders │?? ├── __init__.py │?? └── __pycache__ └── scrapy.cfg
我們通常寫爬蟲都是在spiders里寫爬蟲解析規(guī)則,以及編寫數(shù)據(jù)存儲(chǔ)程序。
基礎(chǔ)spider我們首先來看爬蟲程序,最基本是以下這個(gè)樣子:
import scrapy from sqlalchemy import distinct class ExampleSpider(scrapy.Spider): name = "example_spider" allowed_domains = [] start_urls = [ "https://www.example.com" ] def parse(self,response): pass
這樣的一個(gè)基本爬蟲,只要配置好start_urls,在這里寫上我們想要去爬的URL,可以編寫很多個(gè),start_urls是一個(gè)數(shù)組。然后執(zhí)行scrapy crawl example_spider就會(huì)自動(dòng)去爬數(shù)據(jù)了。這里的parse方法是繼承父類scrapy.Spider的解析方法,此處沒有做任何結(jié)果解析以及存儲(chǔ)。
在這個(gè)地方,其實(shí)我們要注意一點(diǎn)是,ExampleSpider這個(gè)類名我們可以瞎姬霸命名,我們?cè)谡{(diào)用scrapy crawl [爬蟲名]的時(shí)候,這個(gè)爬蟲名是根據(jù)這個(gè)類里的name屬性來的,此處的name為example_spider,所以我們?cè)趫?zhí)行的時(shí)候就是:scrapy crawl example_spider。當(dāng)然在具體的編寫過程中我個(gè)人建議是不要瞎姬霸命名,按照業(yè)務(wù)邏輯來。
再回頭看我上面所展示的文件夾結(jié)構(gòu),隨著業(yè)務(wù)的增長(zhǎng),我們很可能編寫個(gè)成百上千的爬蟲,那么每個(gè)爬蟲都放到spiders一個(gè)文件夾里的話,要理清的話就要花大力氣了,而實(shí)際上,在spiders其實(shí)可以創(chuàng)建任意的子文件夾進(jìn)行邏輯上的分類,執(zhí)行crawl的時(shí)候,會(huì)自動(dòng)去遍歷路徑找到我們制定的爬蟲,至于你編寫了哪些爬蟲,同樣可以通過crapy list列出來。
分頁(yè)爬技巧分頁(yè)爬蟲技巧,其實(shí)在搜索引擎上都能找到,而且在segmentfault上都能搜到相應(yīng)的解答,主要就在parse方法中判斷條件或者說找到下一頁(yè)的URL,然后用協(xié)程yield一下scrapy.Request就可以了,也就是用協(xié)程方式手動(dòng)執(zhí)行一下scrapy的Request方法,對(duì)于Request具體的返回,我沒有深入看源代碼研究,大概是在scrapy的底層再次做了一定的處理,實(shí)際的請(qǐng)求并不是Request類發(fā)起的。
常用配置這里要結(jié)合一些原因來進(jìn)行說明。
通常來說,移動(dòng)端的數(shù)據(jù)更好爬,我們可以用chrome的開發(fā)者工具模擬移動(dòng)端瀏覽器,然后看移動(dòng)端的數(shù)據(jù)交互形式以及移動(dòng)端HTML數(shù)據(jù)格式。
另外就是我們爬的時(shí)候通常為了防止被封IP,不能太頻繁,一般是間隔1s鐘去取一次數(shù)據(jù)這樣子。
所以從上面兩方面來說,我們?cè)谧约簩懙呐老x類中加上一個(gè)類屬性download_delay,如
import scrapy from sqlalchemy import distinct class ExampleSpider(scrapy.Spider): download_delay = 1 # 1s鐘發(fā)起一次請(qǐng)求,當(dāng)前爬蟲執(zhí)行過程中,對(duì)任何位置的Reqeust都有效 name = "example_spider" allowed_domains = [] start_urls = [ "https://www.example.com" ] def parse(self,response): pass
另外就是在settings.py設(shè)置
DEFAULT_REQUEST_HEADERS = { "user-agent" : "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3423.2 Mobile Safari/537.36" }
一個(gè)這樣的header頭,模擬手機(jī)瀏覽器。
錯(cuò)入日志的重要性在做爬蟲的時(shí)候,非常重要的一點(diǎn)就是錯(cuò)誤日志的記錄,通常來說我們?cè)?b>settings.py中配置以下兩個(gè)參數(shù):
LOG_LEVEL = "DEBUG" LOG_FILE = "./log.log" # 錯(cuò)誤日志記錄文件及路徑
通常來說,我們最好是把LOG_LEVEL設(shè)置為DEBUG,也就是說,我們把所有的調(diào)試信息都輸入到錯(cuò)誤日志中進(jìn)行記錄,方便檢查編寫爬蟲過程中可能出現(xiàn)的任何問題,盡可能的確保每個(gè)環(huán)節(jié)不出錯(cuò)。
如果沒有意識(shí)到錯(cuò)誤日志的重要性,在寫爬蟲的過程中只能抓瞎了,我是踩了好幾次大坑才有過這種覺悟。
數(shù)據(jù)存儲(chǔ)數(shù)據(jù)存儲(chǔ),我個(gè)人用的是sqlalchemy,是一個(gè)很強(qiáng)大的庫(kù),我個(gè)人也做了些基礎(chǔ)的封裝,使用起來更方便。
數(shù)據(jù)存儲(chǔ)一方面可能是在parse方法中進(jìn)行解析后處理,另外的話,parse可以進(jìn)行統(tǒng)一解析,然后在close進(jìn)行全部批量存儲(chǔ),主要看具體的業(yè)務(wù)邏輯情況。
遇到過最坑爹的問題最坑爹的問題就是要千萬(wàn)保證數(shù)據(jù)來源性的可靠,一定要反復(fù)對(duì)比其來源數(shù)據(jù)是否有問題,不然出現(xiàn)我們所醫(yī)療之外的數(shù)據(jù)情況,很可能找不到原因。
舉個(gè)例子,我們?cè)谧龇猪?yè)處理的時(shí)候,已經(jīng)到末尾頁(yè)了,通常就可以判定結(jié)束爬蟲了,但假設(shè)在某一個(gè)數(shù)據(jù)分類下,這個(gè)末尾頁(yè)其實(shí)有個(gè)鏈接指向了其他分類頁(yè),然而在web瀏覽器中通過javascript程序禁止了跳轉(zhuǎn),然后就陷入了不斷循環(huán)的取數(shù)據(jù)的過程中或者重復(fù)取了數(shù)據(jù)。當(dāng)然這個(gè)是一個(gè)不太可能存在的可能情況,不過我在編寫的過程中就遇到過類似的問題,在處理的時(shí)候千萬(wàn)要保證數(shù)據(jù)解析和來源數(shù)據(jù)的可靠性,切記切記!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41859.html
摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...
摘要:爬蟲大戰(zhàn)京東商城引言上一篇已經(jīng)講過怎樣獲取鏈接,怎樣獲得參數(shù)了,詳情請(qǐng)看爬取京東商城普通篇代碼詳解首先應(yīng)該構(gòu)造請(qǐng)求,這里使用這個(gè)方法默認(rèn)調(diào)用的是構(gòu)造請(qǐng)求,如果要改變默認(rèn)的請(qǐng)求,那么必須重載該方法,這個(gè)方法的返回值必須是一個(gè)可迭代的對(duì)象,一般 SCrapy爬蟲大戰(zhàn)京東商城 引言 上一篇已經(jīng)講過怎樣獲取鏈接,怎樣獲得參數(shù)了,詳情請(qǐng)看python爬取京東商城普通篇 代碼詳解 首先應(yīng)該構(gòu)造請(qǐng)求...
摘要:學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分個(gè)大的版塊抓取,分析,存儲(chǔ)另外,比較常用的爬蟲框架,這里最后也詳細(xì)介紹一下。網(wǎng)絡(luò)爬蟲要做的,簡(jiǎn)單來說,就是實(shí)現(xiàn)瀏覽器的功能。 Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分3個(gè)大的版塊:抓取,分析,存儲(chǔ) 另外,比較常用的爬蟲框架Scrapy,這里最后也詳細(xì)介紹一下。 首先列舉一下本人總結(jié)的相關(guān)文章,這些覆蓋了入門網(wǎng)絡(luò)爬蟲需要的基本概念和技巧:寧哥的小站-網(wǎng)絡(luò)爬蟲,當(dāng)我們?cè)跒g覽器中輸入...
摘要:最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。一個(gè)爬蟲的框架。基本等價(jià)于選擇其中的文字提取屬性文檔,這個(gè)我不會(huì),我也沒看使用這個(gè)類庫(kù)解析如請(qǐng)求方式可以用來給中文字符數(shù)據(jù)放入傳遞即可。 最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。 其實(shí)之前我司是有專門做爬蟲的,不用前端這邊出人干活。后來那人離職了,有可...
閱讀 908·2023-04-25 18:51
閱讀 1863·2021-09-09 11:39
閱讀 3276·2019-08-30 15:53
閱讀 2090·2019-08-30 13:03
閱讀 1304·2019-08-29 16:17
閱讀 574·2019-08-29 11:33
閱讀 1878·2019-08-26 14:00
閱讀 2118·2019-08-26 13:41