Scrapy Python spider无法使用LinkExtractor或手动请求()找到链接

2024-09-29 23:27:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个在域:https://www.ghcjobs.apply2jobs.com...上爬过所有结果页的废蜘蛛。代码应该做三件事:

(1)浏览1-1000页。这些页面是完全相同的,只是通过URL的最后一部分来区分:amp;CurrentPage=#。在

(2)跟踪结果表内的每个链接,其中包含招聘公告,其中链接的class=SearchResult。我在这里的任何链接都不在这里,所以这些都不是我的麻烦。在

(3)将工作描述页面上显示的信息存储在key:值JSON格式。(这一部分基本上起作用)

我以前使用过scrapy和crawlspider,使用'rule=[rule(LinkExtractor(allow='方法递归地解析一个页面,以找到与给定regex模式匹配的所有链接)。我现在在第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的输出,上面切掉了一些执行代码:

^{pr2}$

目前,我被困在这个项目的目标(1)。如你所见,我的蜘蛛只在起始网址页面上爬行。我的正则表达式应该是针对正确的页面导航按钮,因为我已经测试了正则表达式。我的回调函数parse_inner_page正在工作,如我插入的调试注释所示,但仅在第一页上。我是不是用错了“规则”?我在想,也许网页是HTTPS的原因。。。在

作为修补解决方案的一种方法,我尝试使用对结果的第二页的手动请求;但这不起作用。这也是密码。在

Request("https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPage=2",  callback = 'parse_inner_page')

有人能提供指导吗?有没有更好的办法?我从上周五就开始研究这个问题。非常感谢你。在

更新:我已经解决了这个问题。问题是我使用的起始网址。在

start_urls = ['https://www.ghcjobs.apply2jobs.com/ProfExt/index.cfm?fuseaction=mExternal.returnToResults&CurrentPage=1'] 

指向一个post form提交页面,该页面是单击This页面上的“搜索”按钮的结果。它在客户端运行javascript,向服务器提交一个表单,服务器报告完整的作业板,第1-512页。但是,还有另一个硬编码的URL,它显然不需要使用任何客户端javascript就可以调用服务器。所以现在我的起始网址是

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

一切都回到正轨!以后,请检查是否有任何javascript独立的url用于调用服务器资源。在


Tags: fromhttpscomindex链接www页面scrapy
1条回答
网友
1楼 · 发布于 2024-09-29 23:27:19

你真的和你一样看待网页吗?现在,越来越多的网站是用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'
>>> 

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

另外,您可以使用scrapyparse命令来帮助您调试。例如,我经常使用这个命令。在

^{pr2}$

其他一些稀薄的commands,也许硒对以后的发展有帮助。在

在这里,我使用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.

更新:

你所做的只是一个非常琐碎的刮擦工作,你真的不需要刮擦,这有点过分了。以下是我的建议:

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

相关问题 更多 >

    热门问题