摘要:下載器負(fù)責(zé)獲取頁(yè)面,然后將它們交給引擎來(lái)處理。內(nèi)置了一些下載器中間件,這些中間件將在后面介紹。下載器中間件下載器中間件可以在引擎和爬蟲(chóng)之間操縱請(qǐng)求和響應(yīng)對(duì)象。爬蟲(chóng)中間件與下載器中間件類(lèi)似,啟用爬蟲(chóng)中間件需要一個(gè)字典來(lái)配置。
前段時(shí)間我寫(xiě)了一篇《scrapy快速入門(mén)》,簡(jiǎn)單介紹了一點(diǎn)scrapy的知識(shí)。最近我的搬瓦工讓墻了,而且我又學(xué)了一點(diǎn)mongodb的知識(shí),所以這次就來(lái)介紹一些scrapy的進(jìn)階知識(shí),做一些真正有用的爬蟲(chóng)來(lái)。
scrapy組件介紹首先先來(lái)介紹一下scrapy的體系結(jié)構(gòu)和組件。
scrapy引擎。顧名思義,它負(fù)責(zé)調(diào)用爬蟲(chóng)爬取頁(yè)面并將數(shù)據(jù)交給管道來(lái)處理。
調(diào)度程序。調(diào)度程序從引擎獲取請(qǐng)求,然后將這些請(qǐng)求交給相應(yīng)的處理者來(lái)處理。
下載器。下載器負(fù)責(zé)獲取web頁(yè)面,然后將它們交給引擎來(lái)處理。
爬蟲(chóng)。這是我們要編寫(xiě)的部分,爬蟲(chóng)負(fù)責(zé)從頁(yè)面抽取要處理的數(shù)據(jù),然后交由管道來(lái)處理。
項(xiàng)目管道。爬蟲(chóng)抽取出來(lái)的數(shù)據(jù),就要交給管道來(lái)處理,我們可以編寫(xiě)自己的管道來(lái)清洗、驗(yàn)證和持久化數(shù)據(jù)。
下載器中間件。下載器中間件在下載器和scrapy引擎之間工作,我們可以利用下載器中間件在將頁(yè)面交給爬蟲(chóng)之前做一些事情。scrapy內(nèi)置了一些下載器中間件,這些中間件將在后面介紹。
爬蟲(chóng)中間件。爬蟲(chóng)中間件可以讓我們控制爬蟲(chóng)的回調(diào)等等。在后面會(huì)介紹一些內(nèi)置的爬蟲(chóng)中間件。
下面是scrapy官網(wǎng)的結(jié)構(gòu)圖,可以幫助我們理解scrapy的體系。
在以前的爬蟲(chóng)中我們都是直接返回一個(gè)字典,其實(shí)這并不是最佳實(shí)踐。scrapy提供了一個(gè)Item基類(lèi),我們可以通過(guò)繼承這個(gè)類(lèi)定義自己的結(jié)構(gòu)化數(shù)據(jù),比到處傳遞字典更好。下面是官方文檔的例子。
import scrapy class Product(scrapy.Item): name = scrapy.Field() price = scrapy.Field() stock = scrapy.Field() last_updated = scrapy.Field(serializer=str)
這些項(xiàng)目類(lèi)一般都定義在scrapy項(xiàng)目的items.py文件中。定義好之后,在爬蟲(chóng)中我們就不應(yīng)該在反掌字典了,而是初始化并返回我們自定義的Item對(duì)象。
請(qǐng)求和響應(yīng)對(duì)象scrapy通過(guò)請(qǐng)求和響應(yīng)對(duì)象來(lái)處理網(wǎng)頁(yè)請(qǐng)求,這部分的文檔可以參考https://doc.scrapy.org/en/latest/topics/request-response.html。請(qǐng)求和響應(yīng)還有一些子類(lèi),可以幫助我們完成更具體的工作。例如Request的子類(lèi)FormRequest就可以幫助我們模擬用戶登錄。
有時(shí)候需要模擬用戶登錄,這時(shí)候可以使用FormRequest.from_response方法。這時(shí)候爬蟲(chóng)功能稍有變化,parse函數(shù)用來(lái)發(fā)送用戶名和密碼,抽取數(shù)據(jù)的操作放在回調(diào)函數(shù)中進(jìn)行。
import scrapy class LoginSpider(scrapy.Spider): name = "example.com" start_urls = ["http://www.example.com/users/login.php"] def parse(self, response): return scrapy.FormRequest.from_response( response, formdata={"username": "john", "password": "secret"}, callback=self.after_login ) def after_login(self, response): # 檢查是否登錄成功 if "authentication failed" in response.body: self.logger.error("Login failed") return # 在這里繼續(xù)爬取數(shù)據(jù)管道(pipeline)
管道用來(lái)處理爬蟲(chóng)抽取到的數(shù)據(jù),我們可以通過(guò)管道對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證和持久化等操作。管道其實(shí)就是帶有process_item(self, item, spider)函數(shù)的一個(gè)普通類(lèi)。下面是scrapy官方文檔的例子,這個(gè)例子驗(yàn)證獲取到的數(shù)據(jù)是否存在價(jià)格字段,并丟棄沒(méi)有價(jià)格字段的無(wú)效數(shù)據(jù)。這里還引用了scrapy預(yù)定義的DropItem異常,這個(gè)異常必須在管道中拋出,表示管道應(yīng)該丟棄這個(gè)數(shù)據(jù)。如果想了解scrapy異常,可以查看官方文檔。
from scrapy.exceptions import DropItem class PricePipeline(object): vat_factor = 1.15 def process_item(self, item, spider): if item["price"]: if item["price_excludes_vat"]: item["price"] = item["price"] * self.vat_factor return item else: raise DropItem("Missing price in %s" % item)
管道不是一定義好就能用的,還需要在配置文件settings.py中激活。
ITEM_PIPELINES = { "myproject.pipelines.PricePipeline": 300, "myproject.pipelines.JsonWriterPipeline": 800, }將數(shù)據(jù)保存到MongoDB的管道
管道除了驗(yàn)證數(shù)據(jù),還可以將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。這時(shí)候僅僅一個(gè)process_item(self, item, spider)函數(shù)就不夠了。所以操作數(shù)據(jù)庫(kù)的管道還應(yīng)該包含幾個(gè)函數(shù)用于建立和關(guān)閉數(shù)據(jù)庫(kù)連接。
下面的例子也是scrapy官方文檔的例子,演示了持久化數(shù)據(jù)管道的用法。這個(gè)管道是從類(lèi)方法from_crawler(cls, crawler)中初始化出來(lái)的,該方法實(shí)際上讀取了scrapy的配置文件。這和直接將數(shù)據(jù)庫(kù)連接寫(xiě)在代碼中相比,是更加通用的方式。初始化和關(guān)閉數(shù)據(jù)庫(kù)連接的操作都在對(duì)應(yīng)的方法中執(zhí)行。
import pymongo class MongoPipeline(object): collection_name = "scrapy_items" def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get("MONGO_URI"), mongo_db=crawler.settings.get("MONGO_DATABASE", "items") ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db[self.collection_name].insert_one(dict(item)) return item使用文件和圖片管道 文件和圖片管道處理過(guò)程
除了自己編寫(xiě)管道之外,scrapy還預(yù)定義了幾個(gè)管道,可以幫助我們方便的保存文件和圖片。這些管道有以下特點(diǎn):
可以避免重復(fù)下載最近的文件。
指定文件保存位置(文件系統(tǒng)或者亞馬遜S3)
對(duì)于圖片管道來(lái)說(shuō)還有額外功能:
將圖片轉(zhuǎn)換成常見(jiàn)格式(JPG)和模式(RGB)
生成圖片縮略圖
只下載大于某長(zhǎng)寬的圖片
使用文件管道的過(guò)程如下:
首先需要Item類(lèi)中有file_urls和files兩個(gè)屬性,然后在爬蟲(chóng)中將想爬取的文件地址放到file_urls屬性中,然后返回
在Item傳遞到文件管道的時(shí)候,調(diào)度程序會(huì)用下載器將地址對(duì)應(yīng)的文件下載下來(lái),將文件屬性(包括保存路徑等)放到files屬性中,file_urls和files中是一一對(duì)應(yīng)的
使用圖片管道的過(guò)程是相似的,不過(guò)要操作的屬性是image_urls和images。
如果你不想使用這幾個(gè)屬性,其實(shí)屬性名也是可以修改的,需要修改下面四個(gè)屬性。
FILES_URLS_FIELD = "field_name_for_your_files_urls" FILES_RESULT_FIELD = "field_name_for_your_processed_files" IMAGES_URLS_FIELD = "field_name_for_your_images_urls" IMAGES_RESULT_FIELD = "field_name_for_your_processed_images"管道配置
要啟用文件管道和圖片管道,同樣需要激活,當(dāng)然如果同時(shí)激活這兩個(gè)管道也是可行的。
ITEM_PIPELINES = {"scrapy.pipelines.images.ImagesPipeline": 1} # 或者 ITEM_PIPELINES = {"scrapy.pipelines.files.FilesPipeline": 1}
文件和圖片保存位置需要分別指定。
FILES_STORE = "/path/to/valid/dir" IMAGES_STORE = "/path/to/valid/dir"
文件和圖片管道可以避免下載最近的文件,對(duì)應(yīng)的文件過(guò)期時(shí)間也可以配置,單位是天。
# 120 days of delay for files expiration FILES_EXPIRES = 120 # 30 days of delay for images expiration IMAGES_EXPIRES = 30
圖片管道可以在保存圖片的時(shí)候同時(shí)生成縮略圖,縮略圖配置是一個(gè)字典,鍵是縮略圖的名字,值是縮略圖長(zhǎng)和寬。
IMAGES_THUMBS = { "small": (50, 50), "big": (270, 270), }
最后圖片會(huì)保存成下面這樣,圖片的文件名是圖片路徑的SHA1哈希值。
/圖片保存路徑/full/完整圖片.jpg /圖片保存路徑/thumbs/small/小圖片.jpg /圖片保存路徑/thumbs/big/中圖片.jpg
如果不想使用SHA1哈希值作為文件名,可以繼承ImagesPipeline基類(lèi)并重寫(xiě)file_path函數(shù),這里是另外一位簡(jiǎn)書(shū)作者的爬蟲(chóng)項(xiàng)目,他重寫(xiě)了這個(gè)函數(shù)。我們可以作為參考。
如果要過(guò)濾小圖片,啟用下面的配置。默認(rèn)情況下對(duì)圖片尺寸沒(méi)有約束,所以所有圖片都會(huì)下載。
IMAGES_MIN_HEIGHT = 110 IMAGES_MIN_WIDTH = 110
默認(rèn)情況下文件和圖片管道不支持重定向,遇到需要重定向的鏈接意味著下載失敗,不過(guò)我們也可以啟用重定向。
MEDIA_ALLOW_REDIRECTS = True下載器中間件
下載器中間件可以在scrapy引擎和爬蟲(chóng)之間操縱請(qǐng)求和響應(yīng)對(duì)象。要啟用下載器中間件,啟用下面的配置。這是一個(gè)字典,字典的鍵是要啟用的中間件,值會(huì)用來(lái)比較中間件之間的順序。
DOWNLOADER_MIDDLEWARES = { "myproject.middlewares.CustomDownloaderMiddleware": 543, }
如果希望禁用某些內(nèi)置的中間件,可以將值設(shè)置為None。
DOWNLOADER_MIDDLEWARES = { "myproject.middlewares.CustomDownloaderMiddleware": 543, "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None, }編寫(xiě)自己的下載器中間件
自定義下載器中間件應(yīng)該繼承scrapy.downloadermiddlewares.DownloaderMiddleware類(lèi),該類(lèi)有如下幾個(gè)方法,用于操縱請(qǐng)求和響應(yīng),我們只要重寫(xiě)這幾個(gè)方法即可。這幾個(gè)方法的作用請(qǐng)參考官方文檔,它們比較復(fù)雜,所以我就不說(shuō)了。
process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)
內(nèi)置的下載器中間件scrapy內(nèi)置了14個(gè)下載器中間件,我簡(jiǎn)單介紹一下其中的幾個(gè)。詳情參考文檔。
CookiesMiddleware用于在爬蟲(chóng)發(fā)起請(qǐng)求和獲取響應(yīng)的時(shí)候保持Cookie。
DefaultHeadersMiddleware用于設(shè)置請(qǐng)求的默認(rèn)請(qǐng)求頭。
該配置位于DEFAULT_REQUEST_HEADERS,默認(rèn)值如下。
{ "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en", }HttpProxyMiddleware
設(shè)置使用的網(wǎng)絡(luò)代理。
UserAgentMiddleware設(shè)置使用的用戶代理。
爬蟲(chóng)中間件與下載器中間件類(lèi)似,啟用爬蟲(chóng)中間件需要一個(gè)字典來(lái)配置。
SPIDER_MIDDLEWARES = { "myproject.middlewares.CustomSpiderMiddleware": 543, }
想要關(guān)閉某個(gè)中間件的時(shí)候傳遞None值。
SPIDER_MIDDLEWARES = { "myproject.middlewares.CustomSpiderMiddleware": 543, "scrapy.spidermiddlewares.offsite.OffsiteMiddleware": None, }自定義爬蟲(chóng)中間件
編寫(xiě)自己的爬蟲(chóng)中間件需要繼承scrapy.spidermiddlewares.SpiderMiddleware基類(lèi),并重寫(xiě)以下幾個(gè)方法。
process_spider_input(response, spider)
process_spider_output(response, result, spider)
process_spider_exception(response, exception, spider)
process_start_requests(start_requests, spider)
內(nèi)置的爬蟲(chóng)中間件scrapy內(nèi)置了5個(gè)爬蟲(chóng)中間件,這里我僅介紹一兩個(gè)。
DepthMiddleware該中間件記錄了爬蟲(chóng)爬取請(qǐng)求地址的深度。
我們可以使用DEPTH_LIMIT來(lái)指定爬蟲(chóng)爬取的深度。
UrlLengthMiddleware該中間件會(huì)過(guò)濾掉超出最大允許長(zhǎng)度的URL,爬蟲(chóng)不會(huì)訪問(wèn)這些超長(zhǎng)URL。
最大長(zhǎng)度通過(guò)URLLENGTH_LIMIT配置來(lái)指定,默認(rèn)值是2083。
URLLENGTH_LIMIT = 2083內(nèi)建服務(wù)
scrapy內(nèi)置了幾個(gè)服務(wù),可以讓我們使用scrapy更加方便。
日志爬蟲(chóng)類(lèi)定義了log函數(shù),我們可以方便的在爬蟲(chóng)類(lèi)中記錄日志。
import scrapy class MySpider(scrapy.Spider): name = "myspider" start_urls = ["https://scrapinghub.com"] def parse(self, response): self.logger.info("Parse function called on %s", response.url)
日志相關(guān)的配置,點(diǎn)擊可以跳轉(zhuǎn)到官方文檔查看詳細(xì)信息。
LOG_FILE
LOG_ENABLED
LOG_ENCODING
LOG_LEVEL
LOG_FORMAT
LOG_DATEFORMAT
LOG_STDOUT
LOG_SHORT_NAMES
發(fā)送電子郵件有時(shí)候我們可能希望爬到一定數(shù)量的數(shù)據(jù)就發(fā)送電子郵件進(jìn)行提醒。scrapy也內(nèi)置了這個(gè)功能。我們可以通過(guò)構(gòu)造函數(shù)參數(shù)來(lái)創(chuàng)建郵件發(fā)送器。
from scrapy.mail import MailSender mailer = MailSender(這里是構(gòu)造函數(shù)參數(shù))
也可以從配置文件實(shí)例化。
mailer = MailSender.from_settings(settings)
然后調(diào)用send方法就可以發(fā)送郵件了。
mailer.send(to=["someone@example.com"], subject="Some subject", body="Some body", cc=["another@example.com"])
電子郵件相關(guān)配置參考官方文檔。
web服務(wù)這個(gè)功能本來(lái)是寫(xiě)在官方文檔內(nèi)建服務(wù)條目下的,但是實(shí)際上這個(gè)功能已經(jīng)變成了一個(gè)多帶帶的項(xiàng)目,需要額外安裝。
pip install scrapy-jsonrpc
然后在擴(kuò)展中包含這個(gè)功能。
EXTENSIONS = { "scrapy_jsonrpc.webservice.WebService": 500, }
還需要在配置中啟用該功能。
JSONRPC_ENABLED = True
然后在爬蟲(chóng)運(yùn)行的時(shí)候訪問(wèn)http://localhost:6080/crawler即可查看爬蟲(chóng)運(yùn)行情況了。
該項(xiàng)目的其他配置查看其官方文檔。
優(yōu)化爬蟲(chóng)爬蟲(chóng)項(xiàng)目可以通過(guò)修改一些配置進(jìn)行優(yōu)化。
增大并發(fā)數(shù)并發(fā)數(shù)可以通過(guò)下面的配置進(jìn)行設(shè)置。具體的并發(fā)數(shù)需要根據(jù)服務(wù)器的CPU等設(shè)置來(lái)進(jìn)行更改。一般來(lái)說(shuō)服務(wù)器CPU使用在80%-90%之間利用率比較高。我們可以從并發(fā)數(shù)100開(kāi)始反復(fù)進(jìn)行測(cè)試。
CONCURRENT_REQUESTS = 100增大線程池
scrapy通過(guò)一個(gè)線程池來(lái)進(jìn)行DNS查詢,增大這個(gè)線程池一般也可以提高scrapy性能。
REACTOR_THREADPOOL_MAXSIZE = 20降低日志級(jí)別
默認(rèn)情況下scrapy使用debug級(jí)別來(lái)打印日志,通過(guò)降低日志級(jí)別,我們可以減少日志打印,從而提高程序運(yùn)行速度。
LOG_LEVEL = "INFO"禁用Cookie
如果不是必須的,我們可以通過(guò)禁用Cookie來(lái)提高性能。如果需要登錄用戶才能爬取數(shù)據(jù),不要禁用Cookie。
COOKIES_ENABLED = False關(guān)閉重試
頻繁重試可能導(dǎo)致目標(biāo)服務(wù)器響應(yīng)緩慢,我們自己訪問(wèn)不了別人也訪問(wèn)不了。所以可以考慮關(guān)閉重試。
RETRY_ENABLED = False減少下載超時(shí)
如果網(wǎng)絡(luò)連接比較快的話,我們可以減少下載超時(shí),讓爬蟲(chóng)卡住的請(qǐng)求中跳出來(lái),一般可以提高爬蟲(chóng)效率。
DOWNLOAD_TIMEOUT = 15關(guān)閉重定向
如果不是必要的話,我們可以關(guān)閉重定向來(lái)提高爬蟲(chóng)性能。
REDIRECT_ENABLED = False自動(dòng)調(diào)整爬蟲(chóng)負(fù)載
scrapy有一個(gè)擴(kuò)展可以自動(dòng)調(diào)節(jié)服務(wù)器負(fù)載,它通過(guò)一個(gè)算法來(lái)確定最佳的爬蟲(chóng)延時(shí)等設(shè)置。它的文檔在這里。
相關(guān)配置如下,點(diǎn)擊鏈接可以跳轉(zhuǎn)到對(duì)應(yīng)文檔。
AUTOTHROTTLE_ENABLED
AUTOTHROTTLE_START_DELAY
AUTOTHROTTLE_MAX_DELAY
AUTOTHROTTLE_TARGET_CONCURRENCY
AUTOTHROTTLE_DEBUG
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY
部署爬蟲(chóng)官方文檔介紹了兩種部署爬蟲(chóng)的方式,可以將爬蟲(chóng)部署到服務(wù)器上遠(yuǎn)程執(zhí)行。第一種是通過(guò)Scrapyd開(kāi)源項(xiàng)目來(lái)部署,也是這里要介紹的方式。第二種是通過(guò)scrapy公司提供的商業(yè)收費(fèi)版服務(wù)Scrapy Cloud部署,推薦有財(cái)力的公司考慮。
服務(wù)器端首先服務(wù)器需要安裝scrapyd包,如果是Linux系統(tǒng)還可以考慮使用對(duì)應(yīng)的包管理器來(lái)安裝。
pip install scrapyd apt-get install scrapyd
然后運(yùn)行scrapyd服務(wù),如果使用系統(tǒng)包管理器安裝,那么可能已經(jīng)配置好了systemd文件。
scrapyd # 或者 systemctl enable scrapyd
scrapyd附帶了一個(gè)簡(jiǎn)單的web界面可以幫助我們查看爬蟲(chóng)運(yùn)行情況,默認(rèn)情況下訪問(wèn)http://localhost:6800/來(lái)查看這個(gè)界面。
scrapyd的配置文件可以是~/.scrapyd.conf或者/etc/scrapyd/scrapyd.conf。下面是一個(gè)簡(jiǎn)單配置,綁定所有端口,這樣一來(lái)從任意位置都可以訪問(wèn)web界面。
[scrapyd] bind_address = 0.0.0.0
scrapyd的功能可以查看其API文檔。
客戶端客戶端如果要上傳爬蟲(chóng),可以通過(guò)服務(wù)器API的端點(diǎn)addversion.json來(lái)實(shí)現(xiàn),或者安裝一個(gè)簡(jiǎn)便工具scrapyd-client。
首先安裝客戶端工具。
pip install scrapyd-client
這個(gè)客戶端目前好像有bug,在windows下運(yùn)行scrapy-deploy命令不會(huì)直接執(zhí)行,而是彈出一個(gè)文件關(guān)聯(lián)對(duì)話框。如果你遇到這種情況,可以找到Python安裝路徑下的腳本路徑(例如C:Program FilesPython36Scripts),然后編寫(xiě)一個(gè)scrapyd-deploy.bat批處理文件,內(nèi)容如下。這樣就可以正常運(yùn)行了。
@"c:program filespython36python.exe" "c:program filespython36Scriptsscrapyd-deploy" %*
然后切換到項(xiàng)目路徑,編輯項(xiàng)目全局配置文件scrapy.cfg,添加部署路徑。
[deploy] url = http://192.168.64.136:6800/ project = quotesbot
然后直接運(yùn)行scrapy-deploy命令,就可以看到項(xiàng)目已經(jīng)成功部署到服務(wù)器上了。
運(yùn)行爬蟲(chóng)需要使用scrapyd的API,例如使用curl,可以用下面的命令。
curl http://192.168.64.136:6800/schedule.json -d project=quotesbot -d spider=toscrape-css
或者使用Jetbrains 系列IDE 2017.3的基于編輯器的HTTP客戶端。
然后點(diǎn)擊Jobs就可以看到爬蟲(chóng)已經(jīng)開(kāi)始運(yùn)行了。如果要查看狀態(tài),點(diǎn)擊右邊的log即可。
以上就是scrapy的進(jìn)階介紹了,利用這些功能,我們可以編寫(xiě)更加實(shí)用的爬蟲(chóng),并將它們部署到服務(wù)器上。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44529.html
摘要:楚江數(shù)據(jù)是專(zhuān)業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲(chóng)軟件定制開(kāi)發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類(lèi)信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專(zhuān)業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲(chóng)學(xué)習(xí)系列教程(來(lái)源于某博主:htt...
摘要:爬蟲(chóng)是我接觸計(jì)算機(jī)編程的入門(mén)。練練練本文推薦的資源就是以項(xiàng)目練習(xí)帶動(dòng)爬蟲(chóng)學(xué)習(xí),囊括了大部分爬蟲(chóng)工程師要求的知識(shí)點(diǎn)。拓展閱讀一文了解爬蟲(chóng)與反爬蟲(chóng)最后,請(qǐng)注意,爬蟲(chóng)的工作機(jī)會(huì)相對(duì)較少。 爬蟲(chóng)是我接觸計(jì)算機(jī)編程的入門(mén)。哥當(dāng)年寫(xiě)第一行代碼的時(shí)候別提有多痛苦。 本文旨在用一篇文章說(shuō)透爬蟲(chóng)如何自學(xué)可以達(dá)到找工作的要求。 爬蟲(chóng)的學(xué)習(xí)就是跟著實(shí)際項(xiàng)目去學(xué),每個(gè)項(xiàng)目會(huì)涉及到不同的知識(shí)點(diǎn),項(xiàng)目做多了,自然...
摘要:爬蟲(chóng)項(xiàng)目的管道文件,用來(lái)對(duì)中的數(shù)據(jù)進(jìn)行進(jìn)一步的加工處理。根據(jù)傳入的正則表達(dá)式對(duì)數(shù)據(jù)進(jìn)行提取,返回字符串列表。的作用函數(shù)可創(chuàng)建一個(gè)整數(shù)列表,一般用在循環(huán)中。 項(xiàng)目地址:https://github.com/gejinnvshe...微信公眾號(hào):天字一等 爬取懶人聽(tīng)書(shū)平臺(tái)書(shū)籍的書(shū)名、作者名、分類(lèi),后續(xù)還會(huì)增加爬取音頻 爬蟲(chóng)用到的框架:scrapy Anaconda是專(zhuān)注于數(shù)據(jù)分析的Pyth...
摘要:寫(xiě)在前面用寫(xiě)爬蟲(chóng)的人很多,的爬蟲(chóng)框架也很多,諸如和,筆者還是筆記傾向于,本文就用寫(xiě)一個(gè)小爬蟲(chóng)。本文適用于有一定基礎(chǔ)的,并且對(duì)爬蟲(chóng)有一定了解的開(kāi)發(fā)者。 寫(xiě)在前面 用python寫(xiě)爬蟲(chóng)的人很多,python的爬蟲(chóng)框架也很多,諸如pyspider 和 scrapy,筆者還是筆記傾向于scrapy,本文就用python寫(xiě)一個(gè)小爬蟲(chóng)demo。本文適用于有一定python基礎(chǔ)的,并且對(duì)爬蟲(chóng)有一定了...
閱讀 1772·2021-10-11 10:57
閱讀 2356·2021-10-08 10:14
閱讀 3399·2019-08-29 17:26
閱讀 3356·2019-08-28 17:54
閱讀 3029·2019-08-26 13:38
閱讀 2903·2019-08-26 12:19
閱讀 3613·2019-08-23 18:05
閱讀 1282·2019-08-23 17:04