[英]Scrapy Python spider unable to find links using LinkExtractor or by manual Request()
我正在嘗試編寫一個Scrapy蜘蛛,該蜘蛛會爬過該域上的所有結果頁面: https://www.ghcjobs.apply2jobs.com...。 該代碼應該做三件事:
(1)搜尋所有1-1000頁。 這些頁面是相同的,只是URL的最后部分與眾不同:&CurrentPage =#。
(2)在結果表中包含作業發布的每個鏈接之后,其中鏈接的類= SearchResult。 這些是表中的唯一鏈接,因此我在這里沒有任何麻煩。
(3)將工作描述頁面上顯示的信息以key:value JSON格式存儲。 (這部分工作很簡單)
之前,我曾使用scrapy和CrawlSpiders,使用“ rule = [Rule(LinkExtractor(allow =)”方法來遞歸地解析頁面,以查找與給定正則表達式模式匹配的所有鏈接。目前,我陷入了第1步,無法通過一千個結果頁面。
下面是我的蜘蛛代碼:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http.request import Request
from scrapy.contrib.linkextractors import LinkExtractor
from genesisSpider.items import GenesisJob
class genesis_crawl_spider(CrawlSpider):
name = "genesis"
#allowed_domains = ['http://www.ghcjobs.apply2jobs.com']
start_urls = ['https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPage=1']
#allow &CurrentPage= up to 1000, currently ~ 512
rules = [Rule(LinkExtractor(allow=("^https://www.ghcjobs.apply2jobs.com/ProfExt/
index.cfm\?fuseaction=mExternal.returnToResults&CurrentPage=[1-1000]$")), 'parse_inner_page')]
def parse_inner_page(self, response):
self.log('===========Entrered Inner Page============')
self.log(response.url)
item = GenesisJob()
item['url'] = response.url
yield item
這是Spider的輸出,上面的一些執行代碼被截斷了:
2014-09-02 16:02:48-0400 [genesis] DEBUG: Crawled (200) <GET https://www.ghcjobs
.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPa
ge=1> (referer: None) ['partial']
2014-09-02 16:02:48-0400 [genesis] DEBUG: Crawled (200) <GET https://www.ghcjobs
.apply2jobs.com/ProfExt/index.cfm?CurrentPage=1&fuseaction=mExternal.returnToRes
ults> (referer: https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=
mExternal.returnToResults&CurrentPage=1) ['partial']
2014-09-02 16:02:48-0400 [genesis] DEBUG: ===========Entrered Inner Page========
====
2014-09-02 16:02:48-0400 [genesis] DEBUG: https://www.ghcjobs.apply2jobs.com/Pro
fExt/index.cfm?CurrentPage=1&fuseaction=mExternal.returnToResults
2014-09-02 16:02:48-0400 [genesis] DEBUG: Scraped from <200 https://www.ghcjobs.
apply2jobs.com/ProfExt/index.cfm?CurrentPage=1&fuseaction=mExternal.returnToResu
lts>
{'url': 'https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?CurrentPag
e=1&fuseaction=mExternal.returnToResults'}
2014-09-02 16:02:48-0400 [genesis] INFO: Closing spider (finished)
2014-09-02 16:02:48-0400 [genesis] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 930,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 92680,
'downloader/response_count': 2,
'downloader/response_status_count/200': 2,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2014, 9, 2, 20, 2, 48, 611000),
'item_scraped_count': 1,
'log_count/DEBUG': 7,
'log_count/INFO': 7,
'request_depth_max': 1,
'response_received_count': 2,
'scheduler/dequeued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
'scheduler/enqueued/memory': 2,
'start_time': datetime.datetime(2014, 9, 2, 20, 2, 48, 67000)}
2014-09-02 16:02:48-0400 [genesis] INFO: Spider closed (finished)
目前,我堅持該項目的目標(1)。 如您所見,我的Spider僅在start_url頁面中進行爬網。 我已經測試過正則表達式,因此我的正則表達式應該正確定位頁面導航按鈕。 我的回調函數parse_inner_page正在運行,正如我插入的調試注釋所示,但僅在第一頁上。 我是否錯誤地使用了“規則”? 我當時以為是HTTPS網頁導致了某種原因?
作為解決方案的一種方式,我嘗試對第二頁結果使用手動請求。 這沒有用。 這也是該代碼。
Request("https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPage=2", callback = 'parse_inner_page')
誰能提供任何指導? 有沒有更好的方法可以做到這一點? 從周五開始,我一直在SO / Scrapy文檔中對此進行研究。 非常感謝。
更新:我已經解決了這個問題。 問題出在我使用的起始網址。
start_urls = ['https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPage=1']
指向表單提交后的頁面,該頁面是單擊此頁面上的“搜索”按鈕而得到的。 這將在客戶端運行javascript以向服務器提交表單,該表單將報告完整的工作板,第1-512頁。 但是,存在另一個硬編碼的URL,該URL顯然可以調用服務器,而無需使用任何客戶端javascript。 所以現在我的起始網址是
start_urls = ['https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.searchJobs']
一切都回到正軌! 將來,請檢查是否存在用於調用服務器資源的任何獨立於JavaScript的URL。
您確定Scrapy與您看到網頁的方式相同嗎? 如今,越來越多的網站是由Javascript,Ajax建立的。這些動態內容可能需要功能齊全的瀏覽器才能完全填充。 但是,無論是Nutch還是Scrapy都不會開箱即用。
首先,您需要確保您感興趣的Web內容可以通過scrapy檢索。 有幾種方法可以做到這一點。 我通常使用urllib2
和beautifulsoup4
快速嘗試一下。 您的起始頁未通過我的測試。
$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2
>>> from bs4 import BeautifulSoup
>>> url = "https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPage=1"
>>> html = urllib2.urlopen(url).read()
>>> soup = BeautifulSoup(html)
>>> table = soup.find('div', {'id':'VESearchResults'})
>>> table.text
u'\n\n\n\r\n\t\t\tJob Title\xa0\r\n\t\t\t\r\n\t\t\n\r\n\t\t\tArea of Interest\xa0\r\n\t\t\t\r\n\t\t\n\r\n\t\t\tLocation\xa0\r\n\t\t\t\r\n\t\t\n\r\n\t\t\tState\xa0\r\n\t\t\t\r\n\t\t\n\r\n\t\t\tCity\xa0\r\n\t\t\t\r\n\t\t\n\n\n\r\n\t\t\t\t\tNo results matching your criteria.\r\n\t\t\t\t\n\n\n'
>>>
如您所見,“沒有符合您條件的結果!” 我認為您可能需要弄清楚為什么未填充內容。 餅干? 發布而不是獲取? 用戶代理等
另外,您可以使用scrapy parse命令來幫助您調試。 例如,我經常使用此命令。
scrapy parse http://example.com --rules
其他一些易用的命令 ,也許是Selenium,可能會在以后幫助您。
在這里,我使用的是在iPython中運行scrapy shell來檢查您的起始URL,以及我在瀏覽器中看到的第一條記錄包含Englewood,並且在scrapy抓取的html中不存在
更新:
您正在做的是一件非常瑣碎的刮削工作,並且您確實不需要Scrapy,這有點過頭了。 這是我的建議:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.