簡體   English   中英

Scrapy Python Spider無法使用LinkExtractor或手動Request()找到鏈接

[英]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檢索。 有幾種方法可以做到這一點。 我通常使用urllib2beautifulsoup4快速嘗試一下。 您的起始頁未通過我的測試。

$ 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中不存在

在這里,我使用的是在iPython中運行scrapy shell來檢查您的起始url,以及我在瀏覽器中看到的第一條記錄,其中包含Englewood,而在scrapy抓取的html中不存在。

更新:

您正在做的是一件非常瑣碎的刮削工作,並且您確實不需要Scrapy,這有點過頭了。 這是我的建議:

  1. 看一下Selenium (我假設您編寫Python),最后在嘗試在服務器上運行Selenium時制作無頭Selenium。
  2. 您可以使用PhantomJS來實現這一點,PhantomJS是一個輕巧的Javascript執行程序,可以完成您的工作。 是另一個可能會有所幫助的stackoverflow問題。
  3. 您可以從事其他職業的其他資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM