Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用scrapy获取href和相关信息?_Python_Xpath_Scrapy - Fatal编程技术网

Python 如何使用scrapy获取href和相关信息?

Python 如何使用scrapy获取href和相关信息?,python,xpath,scrapy,Python,Xpath,Scrapy,我对scrapy还不熟悉,但使用python已经有一段时间了。我从scrapy文档以及xpath选择器中吸取了教训。现在,我想把知识做一个小项目。我正试图从工作板上删除工作链接和相关信息,如职位、位置、电子邮件(如果有)、电话号码(如果有)https://www.germanystartupjobs.com/使用刮屑器 我有这个启动码 import scrapy class GermanSpider(scrapy.Spider): # spider name name

我对scrapy还不熟悉,但使用python已经有一段时间了。我从
scrapy
文档以及
xpath
选择器中吸取了教训。现在,我想把知识做一个小项目。我正试图从工作板上删除
工作链接和相关信息,如职位、位置、电子邮件(如果有)、电话号码(如果有)
https://www.germanystartupjobs.com/使用刮屑器

我有这个启动码

import scrapy   

class GermanSpider(scrapy.Spider):

    # spider name 
    name = 'germany'

    # the first page of the website 
    start_urls= ['https://www.germanystartupjobs.com/']
    print start_urls

    def parse(self, response):
        pass 

    def parse_detail(self, response):
        pass 
并将运行spider
scrapy runspider germany

parse
函数中,我想获取
href
s和
parse\u detail
函数中的详细信息

当我用
chrome
developer工具打开提到的页面并检查列出的作业时,我看到所有作业都在这个
ul

<ul id="job-listing-view" class="job_listings job-listings-table-bordered">
第一步是使用
parse
函数获取
href
,然后使用
响应获取
parse_details
中的相关信息。我发现
电子邮件
电话
号码仅在您将从
href
s打开链接时提供,但标题和位置在同一页面的当前
divs
中提供

正如我所提到的,我在python中有不错的编程技巧,但即使在使用了
xpath
s之后,我仍然难以使用它。如何找到链接和相关信息?一些解释很少的示例代码会有很大帮助

我尝试使用代码

    # firstly 
    for element in response.css("job-info-row-listing-class"):

        href = element.xpath('@href').extract()[0]
        print href
        yield scrapy.Request(href, callback=self.parse_detail)

    # secondly 
    values = response.xpath('//div[@class="job-info-row-listing-class"]//a/text()').extract()

    for v in values:
        print v


    # 
    values = response.xpath('//ul[@id="job-listing-view"]//div[@class="job-info-row-listing-class"]//a/text()').extract()

在使用
scrapy runspider germany

运行spider之后,他们似乎没有返回任何信息,因为实际的工作列表是作为POST请求加载的,因此您可能无法轻松提取此站点上的信息

你怎么知道的

  • 类型
    scrapy shell“https://www.germanystartupjobs.com/“
    在您选择的终端中。(你猜对了,这打开了shell,这是非常值得推荐的,当你第一次开始抓取一个网站的时候。在那里你可以尝试函数,XPath等等。)
  • 在shell中,键入
    view(response)
    。这将打开scrapy在默认浏览器中得到的响应
  • 当页面加载完毕后,您应该能够看到没有工作列表。这是因为它们是通过POST请求加载的
我们如何找出它是什么要求?(我使用FireFox的Firebug,不知道它在Chrome上是如何工作的)

  • 启动firebug(例如,右键单击某个元素,然后单击
    Inspect with firebug
    。这将打开firebug,它本质上与Chrome中的开发人员工具类似。我更喜欢它
  • 在这里,您可以单击
    网络
    -选项卡。如果没有任何内容,请重新加载页面
  • 现在,您应该能够看到加载工作列表的请求
在这种情况下,请求
https://www.germanystartupjobs.com/jm-ajax/get_listings/
返回一个
JSON
-对象(单击
JSON
),其中HTML代码是它的一部分

对于spider,这意味着您需要告诉scrapy获取此请求并处理
JSON
-对象的
HTML
-部分,以便能够应用XPath

您可以通过导入spider顶部的
json
-模块,然后导入以下内容:

data = json.loads(response.body)
html = data['html']
selector = scrapy.Selector(text=data['html'], type="html")
例如,如果您想从站点中提取所有url并遵循它们,则需要指定xpath、找到url的位置,并
向该url生成一个新请求。因此,基本上您是在告诉scrapy“看,这是url,现在开始遵循它”

xpath的一个示例是:

url = selector.xpath('//a/@href').extract()
因此,括号中的所有内容都是您的xpath。您不需要指定
ul[@id=“job listing view”]/
中的所有路径,您只需要确保它是一个可识别的路径。例如,我们只在
a
-标记中有您想要的URL,网站上没有其他
a
-标记

这几乎是基本的东西


我强烈建议你在外壳中玩,直到你觉得你掌握了XPath的窍门。找一个看起来很简单的网站,不需要任何请求,看看你是否可以通过XPath找到任何你想要的元素。

谢谢你的回答,这真的很有帮助。我发布了另一个与
scrapy
相关的问题,可能是int为您安装
http://stackoverflow.com/questions/41178659/how-to-get-the-job-description-using-scrapy
url = selector.xpath('//a/@href').extract()