gpt4 book ai didi

python - Scrapy Python 蜘蛛无法使用 LinkExtractor 或手动 Request() 找到链接

转载 作者:行者123 更新时间:2023-12-01 05:03:03 28 4
gpt4 key购买 nike

我正在尝试编写一个 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

这是蜘蛛的输出,上面的一些执行代码被截断:

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)。正如你所看到的,我的蜘蛛只爬过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'] 

进入表单提交后页面,该页面是单击 This 上的“搜索”按钮的结果页。这会在客户端运行 javascript 以向服务器提交表单,该表单会报告完整的招聘板(第 1-512 页)。然而,存在另一个硬编码的 URL,它显然无需使用任何客户端 JavaScript 即可调用服务器。所以现在我的起始网址是

start_urls = ['https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.searchJobs']

一切都回到正轨了!以后检查一下是否有独立于javascript的URL来调用服务器资源。

最佳答案

你确定 Scrapy 看到网页的方式和你一样吗?如今,越来越多的网站是通过 Javascript、Ajax 构建的。而这些动态内容可能需要功能齐全的浏览器才能完全填充。然而,Nutch 和 Scrapy 都无法处理这些开箱即用的问题。

首先,您需要确保您感兴趣的网页内容可以被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'
>>>

如您所见,“没有符合您条件的结果!”我认为您可能需要弄清楚为什么内容没有填充。 cookies ?发布而不是获取?用户代理..等

此外,您可以使用 scrapy parse命令来帮助您调试。例如,我经常使用这个命令。

scrapy parse http://example.com --rules

其他一些scrapy commands ,也许 Selenium 可能会有所帮助。

在这里,我使用 iPython 中运行 scrapy shell 来检查您的起始 url,并且我在浏览器中看到的第一条记录包含 Englewood,但 scrapy 抓取的 html 中不存在该记录

Here I am using running scrapy shell in iPython to inspect your start url and also the first record that I can see in my browser contains Englewood and it doesn't exist in the html that scrapy grabbed.

更新:

你所做的只是一个非常琐碎的抓取工作,而且你真的不需要Scrapy,这有点大材小用了。以下是我的建议:

  1. 看看Selenium (我假设你编写Python)并在你尝试在服务器上运行它时最终制作 headless Selenium。
  2. 您可以使用 PhantomJS 来实现这一点,这是一个更轻量级的 Javascript 执行器来完成您的工作。 Here是另一个可能有帮助的 stackoverflow 问题。
  3. 几个other您可以利用的资源。

关于python - Scrapy Python 蜘蛛无法使用 LinkExtractor 或手动 Request() 找到链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25631815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com