Scrapy之迭代爬取網(wǎng)頁中失效問題及解決
引言
在Scrapy中,在很多種情況下,需要一層層地進行爬取網(wǎng)頁數(shù)據(jù),就是基于url爬取網(wǎng)頁,然后在從網(wǎng)頁中提取url,繼續(xù)爬取,循環(huán)往復(fù)。
本文將講述一個在迭代爬取中,只能爬取第一層網(wǎng)頁的問題。
問題的提出
scrapy crawl enrolldata
Scrapy代碼執(zhí)行結(jié)果輸出如下:
“`
2018-05-06 17:23:06 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: enrolldata)
2018-05-06 17:23:06 [scrapy.utils.log] INFO: Versions: lxml 4.2.1.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 18.4.0, Python 3.6.1 (default, Apr 24 2017, 23:31:02) - [GCC 6.2.0 20161005], pyOpenSSL 17.5.0 (OpenSSL 1.1.0h 27 Mar 2018), cryptography 2.2.2, Platform Linux-4.15.0-20-generic-x86_64-with-debian-buster-sid
2018-05-06 17:23:06 [scrapy.crawler] INFO: Overridden settings: {‘BOT_NAME’: ‘enrolldata’, ‘CONCURRENT_REQUESTS’: 60, ‘CONCURRENT_REQUESTS_PER_IP’: 60, ‘DEPTH_LIMIT’: 5, ‘NEWSPIDER_MODULE’: ‘enrolldata.spiders’, ‘SPIDER_MODULES’: [‘enrolldata.spiders’]}
2018-05-06 17:23:06 [scrapy.middleware] INFO: Enabled extensions:
[‘scrapy.extensions.corestats.CoreStats’,
‘scrapy.extensions.telnet.TelnetConsole’,
‘scrapy.extensions.memusage.MemoryUsage’,
‘scrapy.extensions.logstats.LogStats’]
2018-05-06 17:23:06 [scrapy.middleware] INFO: Enabled downloader middlewares:
[‘scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware’,
‘scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware’,
‘scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware’,
‘scrapy.downloadermiddlewares.useragent.UserAgentMiddleware’,
‘scrapy.downloadermiddlewares.retry.RetryMiddleware’,
‘scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware’,
‘scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware’,
‘scrapy.downloadermiddlewares.redirect.RedirectMiddleware’,
‘scrapy.downloadermiddlewares.cookies.CookiesMiddleware’,
‘scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware’,
‘scrapy.downloadermiddlewares.stats.DownloaderStats’]
2018-05-06 17:23:06 [scrapy.middleware] INFO: Enabled spider middlewares:
[‘scrapy.spidermiddlewares.httperror.HttpErrorMiddleware’,
‘scrapy.spidermiddlewares.offsite.OffsiteMiddleware’,
‘scrapy.spidermiddlewares.referer.RefererMiddleware’,
‘scrapy.spidermiddlewares.urllength.UrlLengthMiddleware’,
‘scrapy.spidermiddlewares.depth.DepthMiddleware’]
2018-05-06 17:23:06 [scrapy.middleware] INFO: Enabled item pipelines:
[‘enrolldata.pipelines.EnrolldataPipeline’]
2018-05-06 17:23:06 [scrapy.core.engine] INFO: Spider opened
open spider ………..pipeline
2018-05-06 17:23:06 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-05-06 17:23:06 [py.warnings] WARNING: /home/bladestone/codebase/python36env/lib/python3.6/site-packages/scrapy/spidermiddlewares/offsite.py:59: URLWarning: allowed_domains accepts only domains, not URLs. Ignoring URL entry http://www.heao.gov.cn/ in allowed_domains.
warnings.warn(“allowed_domains accepts only domains, not URLs. Ignoring URL entry %s in allowed_domains.” % domain, URLWarning)
2018-05-06 17:23:06 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
end of start requests
2018-05-06 17:23:14 [scrapy.core.engine] DEBUG: Crawled (200)
-*- coding: utf-8 -*- import scrapy from enrolldata.items import EnrolldataItem from scrapy.http import FormRequest class SchoolspiderSpider(scrapy.Spider): name = 'enrolldata' cookies = {} allowed_domains = ['http://www.heao.gov.cn/'] start_urls = ['http://www.heao.gov.cn/JHCX/PZ/enrollplan/SchoolList.aspx'] ............. def start_requests(self): formdata = {} formdata['PagesUpDown$edtPage'] = '1' formdata['__EVENTTARGET'] = 'PagesUpDown$lbtnGO' formdata['__EVENTARGUMENT'] = '' formdata['__VIEWSTATE'] = '/wEPDwUKMjA1MTU4MDA1Ng9kFgICBQ9kFgICAQ8PFggeDGZDdXJyZW50UGFnZQIBHhFmVG90YWxSZWNvcmRDb3VudAK4ER4KZlBhZ2VDb3VudAKVAR4JZlBhZ2VTaXplAg9kZGSI36vb/TsBmDT8pwwx37ajH1x0og==' formdata['__VIEWSTATEGENERATOR'] = 'AABB4DD8' formdata['__EVENTVALIDATION'] = '/wEWBQLYvvTTCwK2r/yJBQK6r/CJBgLqhPDLCwLQ0r3uCMy0KhJCAT8jebTQL0eNdj7uk4L5' for i in range(1, 2): formdata['PagesUpDown$edtPage'] = str(i) yield FormRequest(url=self.start_urls[0], headers=self.headers, formdata=formdata, callback=self.parse_school) print("end of start requests") def parse(self, response): print("parse method is invoked") pass def parse_school(self, response): print("parse school data.....") urls = response.xpath('//*[@id="SpanSchoolList"]/div/div[2]/ul/li/a/@href').extract(); print("print out all the matched urls") print(urls) for url in urls: request_url = self.base_url + url print("request_url in major:" + request_url) yield scrapy.Request(request_url, headers=self.request_headers, cookies=self.cookies, callback=self.parse_major_enroll, meta=self.meta) ......
代碼沒有報錯,只是輸出了第一層的Web的爬取結(jié)果。但是第二層沒有執(zhí)行爬取。
問題分析
從日志來進行分析,沒有發(fā)現(xiàn)錯誤信息;第一層代碼爬取正確,但是第二層web爬取,沒有被執(zhí)行,代碼的編寫應(yīng)該沒有問題的。
那問題是什么呢?會不會代碼沒有被執(zhí)行呢?通過添加日志,但是對應(yīng)的代碼并沒有執(zhí)行,日志也被正常輸出。是不是被過濾或者攔截了,從而代碼沒有被執(zhí)行?
經(jīng)過代碼審查之后,發(fā)現(xiàn)allowed_domains設(shè)置的問題,由于起設(shè)置不正確,導(dǎo)致其余的鏈接被直接過濾了。
關(guān)于allowed_domains需要是一組域名,而非一組urls。
問題的解決
需要將之前的domain name修改一下:
allowed_domains = [‘http://www.heao.gov.cn/‘]
將起修改為:
allowed_domains = [‘heao.gov.cn']
重新執(zhí)行爬蟲,發(fā)現(xiàn)多個層次是可以被正確爬取的。
總結(jié)
關(guān)于scrapy是一整套的解決方案,其中很多的設(shè)置和配置需要通過不同的實例來反復(fù)理解和應(yīng)用的,才能如魚得水,庖丁解牛般快速定位問題。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用python+Pyqt5實現(xiàn)串口調(diào)試助手
這篇文章主要介紹了使用python+Pyqt5實現(xiàn)串口調(diào)試助手,串口通訊程序首先要對串口進行設(shè)置,如波特率、數(shù)據(jù)位、停止位、校驗位等,需要的朋友可以參考下2022-04-04基于Python實現(xiàn)智能停車場車牌識別計費系統(tǒng)
這篇文章主要為大家介紹了如何利用Python實現(xiàn)一個智能停車場車牌識別計費系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動手嘗試一下2022-04-04python logging 日志的級別調(diào)整方式
今天小編就為大家分享一篇python logging 日志的級別調(diào)整方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02python安裝numpy&安裝matplotlib& scipy的教程
下面小編就為大家?guī)硪黄猵ython安裝numpy&安裝matplotlib& scipy的教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Python機器學(xué)習(xí)NLP自然語言處理基本操作詞袋模型
本文是Python機器學(xué)習(xí)NLP自然語言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語言處理 (NLP) 的旅程。本篇文章主要學(xué)習(xí)NLP自然語言處理基本操作之詞袋模型2021-09-09淺談Python在pycharm中的調(diào)試(debug)
今天小編就為大家分享一篇淺談Python在pycharm中的調(diào)試(debug),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python實現(xiàn)多條件篩選Excel數(shù)據(jù)并批量繪制直方圖
這篇文章主要為大家介紹了如何Python對Excel數(shù)據(jù)進行多條件篩選和去除并批量繪制直方圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2023-09-09python numpy 常用隨機數(shù)的產(chǎn)生方法的實現(xiàn)
這篇文章主要介紹了python numpy 常用隨機數(shù)的產(chǎn)生方法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python爬蟲使用瀏覽器cookies:browsercookie過程解析
這篇文章主要介紹了Python爬蟲使用瀏覽器cookies:browsercookie,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10