




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、注:作者為了爬蟲道德,在中使用了虛擬的目標(biāo)Zipru,假想它為一個(gè)站點(diǎn)。自己嘗試時(shí),修改為自己的需求即可。這會(huì)創(chuàng)建如下的目錄結(jié)構(gòu): zipru_scrr zipru_scrrscrapy startproject zipru_scrrscrapy 安裝參看新手向爬蟲(三)別人的爬蟲在干啥命令行新建名為 zipru_scrr 的工程目錄。新建項(xiàng)目網(wǎng)絡(luò)爬蟲 Scrapy 從入門到進(jìn)階treelake 關(guān)注0.1 2017.03.30 13:49* 字?jǐn)?shù) 3721 閱讀 31274 評(píng)論 7 喜歡 106Advanced Web Scra: Bypassing 403 Forbidden, capt
2、chas, and more我嘗試過x-ray/cheerio, nokogiri 等等爬蟲框架,最終還是回到了最愛: scrapy。它確實(shí)非常直觀,學(xué)習(xí)曲線友好。通過The Scrapy Tutorial(中文版)你可以在幾分鐘之內(nèi)上手你的第一只爬蟲。然后,當(dāng)你需要完成一些復(fù)雜的任務(wù)時(shí),你很可能會(huì)發(fā)現(xiàn)有內(nèi)置好的、文檔良好的方式來實(shí)現(xiàn)它。(Scrapy 內(nèi)置了許多強(qiáng)大的功能,但 Scrapy 的框架結(jié)構(gòu)良好,如果你還不需要某個(gè)功能,它就不會(huì)影響你。)再者,如果你最終需要某些新功能,例如一個(gè)過濾器來去量的,通常只需要簡(jiǎn)單地子類化某個(gè)組件,并做點(diǎn)小小的修改就可以了。現(xiàn)在需要添加一個(gè)小爬蟲來真正做點(diǎn)
3、什么。創(chuàng)建文件 zipru_scry 添加如下內(nèi)容:r/sers/zipru_s歷 start_urls 列表中的來開始的抓取。先嘗試一個(gè)類似下圖的 列表頁面。的小爬蟲繼承了 scrapy.Ser,它內(nèi)置的 start_requests()方自動(dòng)遍import scrapyclass ZipruSer(scrapy.Ser): name = ziprustart_urls = 默認(rèn)情況下,大多數(shù)這些文件實(shí)際上不會(huì)被使用,它們的存在只是建議以一個(gè)合理的方式組織的代碼。當(dāng)前,你只需要考慮 zipru_scrr(第一個(gè))作為項(xiàng)目的頂層目錄,這就是任何scrapy 命令應(yīng)該運(yùn)行的地方,也是任何相對(duì)路徑
4、的根。添加一個(gè)基本爬蟲 init .py items.py middlewares.py pipelines.py settings.py sers init .py scrapy.cfg對(duì)頁碼元素會(huì)看到:為了讓的小爬蟲知道如何爬取這些,需要為 ZipruSer 類添加一個(gè) parse(response)方法:(頁面元素選取可參看Selectors 選擇器簡(jiǎn)介或新 手向爬蟲(一)利用工具輕松爬取簡(jiǎn)書并分析)在爬取從 start_urls 自動(dòng)開始后,服務(wù)器返回的響應(yīng)會(huì)自動(dòng)傳遞給 parse(self,response)方法。在了頁面中的頁碼元素里包含的后,由每個(gè)解 析出的url 生成新的請(qǐng)求對(duì)
5、象,它們的響應(yīng)的方法即回調(diào)函數(shù)還是這個(gè) parse 方法。只要這些url 還沒被處理過,這些請(qǐng)求將被轉(zhuǎn)換為響應(yīng)對(duì)象,仍 然饋入 parse(self, response)方法(感謝 dupe 過濾器幫自動(dòng)去重)。def parse(self, response): # 從頁面中取出頁碼里包含的for page_url in response.css(atitle =page:attr(href).extract():page_url = response.urljoin(page_url) # 將出的 href 里的自動(dòng)判斷補(bǔ)全yield scrapy.Request(url=page_url
6、, callback=self.parse)# 由出的 url 生成新的請(qǐng)求對(duì)象234現(xiàn)在的小爬蟲已經(jīng)可以不斷地爬取新的列表頁面了。但是還沒有獲取到實(shí)際的信息。讓加上對(duì)表格中元素的來獲取信息。def parse(self, response): # 從頁面中取出頁碼里包含的for page_url in response.xpath(/acontains(title, page)/href).extract():page_url = response.urljoin(page_url)yield scrapy.Request(url=page_url, callback=self.parse)
7、# 提取信息for tr in response.css(table.lista2t tr.lista2): tds = tr.css(td)link = tds1.css(a)0 yield title : link.css(:attr(title).extract_(),url : response.urljoin(link.css(:attr(href).extract_(),date : tds2.css(:text).extract_(),size : tds3.css(:text).extract_(),seeders:(tds4.css(:text).extract_(),lee
8、chers:(tds5.css(:text).extract_(),uploader: tds7.css(:text).extract_(),在出url 生成新的請(qǐng)求后,的小爬蟲會(huì)處理當(dāng)前頁面的信息,生成一個(gè)字典項(xiàng)目,作為爬蟲數(shù)據(jù)輸出的一部分。(Scrapy 會(huì)根據(jù)類型自對(duì)大多數(shù)的數(shù)據(jù)抓取來說,的任務(wù)就已經(jīng)完成了。在命令行運(yùn)行: 個(gè)目標(biāo)爬蟲停止了。可以用tcpdump 來比較兩次請(qǐng)求如果手動(dòng)瀏覽器的差異。但該顯示正常,首先需要檢查的是 User Agent 參數(shù)。的第一個(gè)請(qǐng)求獲得了一個(gè) 403 響應(yīng),它會(huì)被忽略,然后因?yàn)橹唤o了一這時(shí)要考慮是否有公開 API 可以使用,或者耐心分析下問題。簡(jiǎn)單s
9、crapy.extens.logss INFO: Crawled 0 pages (at 0 pages/min), scrd0 items (at 0 items/min) DEBUG:net console listening on :6023scrapy.core.engine DEBUG: Crawled (403) (referer: None) partialscrapy.core.engine DEBUG: Crawled (403) GET(referer: None) partialscrapy.sermiddlewares.httperror INFO: Ignoring
10、response : HTTP sus code is nondled ornot allowedscrapy.core.engine INFO: Closing ser (finished)幾分鐘后,一個(gè)格式良好的JSON Lines 文件 torrents.jl 就生成了,包含了我們需要的信息。相反,會(huì)得到這樣的輸出:scrapy crawl zipru -o torrents.jl動(dòng)判斷yield 產(chǎn)出的是新的請(qǐng)求還是數(shù)據(jù)信息。)。替換為scrapy.core.engine DEBUG: Crawled (200) (referer: None)scrapy.downloadermidd
11、lewares.redirect DEBUG: Redirecting (302) to GETfrom scrapy.core.engine DEBUG: Crawled (200) 0:return self.solve_captcha(captcha_images0)你可以把這個(gè)會(huì)話當(dāng)作一個(gè)瀏覽器,它會(huì)做所有瀏覽器通常所做的事(如獲取外部資源,獲取)。可以在選項(xiàng)卡中導(dǎo)航到新的 URL,點(diǎn)擊按鈕,輸入文本以及做其它各類事務(wù)。Scrapy 支持請(qǐng)求和項(xiàng)目處理的并發(fā),但響應(yīng)的處理是單線程的。這意味著可以使用這個(gè)單獨(dú)的 dryscr會(huì)話,而不用擔(dān)心線程安全。def init (self, set
12、tings): super(). init (settings)# start xvfb to support headless scra if linux in sys.platform:dryscr.start_xvfb()self.dryscr_ses=dryscr.Ses(base_url=)這里處理了在瀏覽器時(shí)可能遇到的各種情況,并且做了一個(gè)正常人 類會(huì)做出的操作。任何時(shí)刻采取的行動(dòng)取決于當(dāng)前的頁面,代碼以一種優(yōu)雅 的方式順序處理變化的情況。# 點(diǎn)擊可能存在的重試retry_links = self.dryscr_ses.css(ahref *= threat_defense) if
13、 len(retry_links) 0:return self.bypass_threat_defense(retry_links0.get_attr(href)# 否則的話,是在一個(gè)重定向頁面上,等待重定向后再次嘗試self.wait_for_redirect()return self.bypass_threat_defense()def wait_for_redirect(self, url = None, wait = 0.1, timeout=10): url = url or self.dryscr_ses.url()for i in range(timeout/wait): tim
14、e.sleep(wait)# 如果 url 發(fā)生變化則返回if self.dryscr_ses.url() != url: return self.dryscr_ses.url()logger.error(fMaybe self.dryscr_ses.url() isnt a redirectURL?)raise Exception(Timed out on the zipru redirect page.)def solve_captcha(self, img, width=1280, height=800): # 對(duì)當(dāng)前頁面截圖self.dryscr_ses.set_viewport_si
15、ze(width, height)filename = tempfile.mktemp(.png)self.dryscr_ses.render(filename, width, height)# 注入javascript 代碼來找到的邊界js = .querySelector(imgsrc *= captcha).getBoundingCntRect()rect = self.dryscr_ses.eval_script(js)box = (rectleft),(recttop),(rectright), (rectbottom)# 解決截圖中的image = Image.open(filen
16、ame) os.unlink(filename) captcha_image = image.crox)captcha = pytesseract.image_to_string(captcha_image) logger.debug(fSolved the Zipru captcha: captcha)最后一個(gè)謎題是解決。有不少解決服務(wù)的API 供你在緊要關(guān)頭使用,但是這里的足夠簡(jiǎn)單可以用OCR 來解決它。使用 pytesseract 做字符識(shí)別,最終可以添加solve_captcha(img)方法來完善的 bypass_threat_defense()。可以看到,如果失敗,會(huì)回到 bypa
17、ss_threat_defense()。這樣我們擁有多次嘗試的機(jī)會(huì),直到成功一次。看起來的爬蟲應(yīng)該成功了,它陷入了無限循環(huán)中:# 提交結(jié)果input = self.dryscr_ses.xpath(/inputid = solve_string)0input.set(captcha)button = self.dryscr_ses.xpath(/buttonid = button_submit)0url = self.dryscr_ses.url() button.click()# 如果被重定向到一個(gè)防御的 URL,重試if self.is_threat_defense_url(self.wa
18、it_for_redirect(url): return self.bypass_threat_defense()# 否則就可以返回當(dāng)前的s的字典s = for_string in self.dryscr_ses.s(): if =zipru.to in_string:key, value =_string.split(;)0.split(=) skey = valuereturns看起來的中間件至少成功解決了,然后重新發(fā)起請(qǐng)求。問題在于新的請(qǐng)求重又觸發(fā)了防御機(jī)制。我一開以為bug 在與添加s,可再三檢查無果。這是另一個(gè)“唯一可能不同的東西是請(qǐng)求頭”的情況。 包含了完整的原始測(cè)是,其中一個(gè)加密
19、的請(qǐng)求頭的哈希值,如果兩次請(qǐng)求頭不匹配,將觸發(fā)防御機(jī)制。這里的意圖可能是防止直接將瀏覽器的s到爬蟲中,但也只是增加了點(diǎn)小麻煩。所以讓在 zipru_scrr/settings.py 明確指定的請(qǐng)求頭:DEFAULT_REQUEST_HEADERS = Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,User-Agent: USER_AGENT,Connection: Keep-Alive, Accept-Encoding: gzip, deflate,Scrapy 和dryscr的請(qǐng)求頭顯然都繞過了
20、觸發(fā)403的第一層過濾器,因?yàn)闆]有得到任何 403 響應(yīng)。但這肯定是因?yàn)槟撤N請(qǐng)求頭的差異造成。猜scrapy.core.engine DEBUG: Crawled (200) (referer: None)zipru_scrr.middlewares DEBUG: Zipru threat defense triggered forzipru_scrr.middlewares DEBUG: Solved the Zipru captcha: UJM39 zipru_scrr.middlewares DEBUG: Zipru threat defense triggered forzipru_scrr.middlewares DEBUG: Solved the Zipru captcha: TQ9OG zipru_scrr.middlewares DEBUG: Zipru threat defense triggered forzipru_scrr.middlewares DEBUG: Solved the Zipru captcha: KH9A8.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 自信的課題演講稿中學(xué)(4篇)
- 慶六一兒童節(jié)活動(dòng)總結(jié)(15篇)
- 消防安全滅火應(yīng)急預(yù)案(19篇)
- 財(cái)務(wù)主管2025年工作總結(jié)(15篇)
- 營養(yǎng)師錄用合同
- 干洗服務(wù)合同
- 財(cái)務(wù)共享服務(wù)協(xié)議補(bǔ)充協(xié)議
- 保潔員個(gè)人年度工作總結(jié)(17篇)
- 簽署購房定金協(xié)議須知
- 農(nóng)村土地拍賣流轉(zhuǎn)協(xié)議
- 2023年浙江省海港投資運(yùn)營集團(tuán)有限公司招聘筆試題庫及答案解析
- 機(jī)器視覺基礎(chǔ)課件
- 學(xué)校學(xué)生評(píng)教表
- 部編版語文五年級(jí)下冊(cè) 第四單元復(fù)習(xí)課件
- 部編版小學(xué)六年級(jí)語文下冊(cè)全冊(cè)教案(詳案)
- 浙江省舟山市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會(huì)明細(xì)及行政區(qū)劃代碼
- 邏輯哲學(xué)論-英文版
- 特斯拉核心零部件供應(yīng)鏈?zhǔn)崂矸治稣n件
- 城市設(shè)計(jì)導(dǎo)則SOM
- 九年級(jí)英語單詞默寫表(最新可打印)
- 學(xué)校辦學(xué)基本條件評(píng)估指標(biāo)體系修訂
評(píng)論
0/150
提交評(píng)論