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

时间:2016-12-15 13:40:16

标签: python xpath scrapy

我是scrapy的新手但是使用python一段时间了。我从scrapy文档和xpath选择器中吸取了教训。现在,我想把知识转化为一个小项目。我试图使用scrapy从工作板job links and the associated info like job title, location, emails (if any), phone numbers (if any)中删除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 

并将运行蜘蛛scrapy runspider germany

parse函数中,我想在href函数中获取parse_detail和详细信息。

当我使用chrome开发人员工具打开提到的页面并检查列出的作业时,我发现所有作业都在ul

<ul id="job-listing-view" class="job_listings job-listings-table-bordered">

然后,分隔作业列在

divs内的许多内容中

<div class="job-info-row-listing-class">有关联的信息,比如,href是在<a href="https://www.germanystartupjobs.com/job/foodpanda-berlin-germany-2-sem-manager-mf/">

内提供的

其他divs提供divs的职位,公司名称,位置等,例如

          <div>
            <h4 class="job-title-class">
              SEM Manager (m/f)            </h4>
          </div>

          <div class="job-company-name">
            <normal>foodpanda<normal>          </normal></normal></div>
          </div>

  <div class="location">
      <div class="job-location-class"><i class="glyphicon glyphicon-map-marker"></i>
        Berlin, Germany          </div>
    </div>

第一步是使用href功能获取parse,然后使用parse_details获取response内的相关信息。我发现emailphone号码仅在您打开href的链接时提供,但标题和位置是在当前divs内提供的同一页。

正如我所提到的,我在python中有很好的编程技巧,但是,即使在使用tutorial之后,我也在努力使用xpath。如何找到链接和相关信息?一些没有解释的示例代码将有很多帮助。

我尝试使用代码

    # 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

运行蜘蛛后,它们似乎没有返回任何内容

1 个答案:

答案 0 :(得分:3)

您可能无法轻松提取此网站上的信息,因为实际的工作列表是作为POST请求加载的。

你怎么知道这个?

  • 在您选择的终端中输入scrapy shell "https://www.germanystartupjobs.com/"。 (当你第一次开始搜索网站时,这打开了,你猜对了,shell,这是非常值得推荐的。你可以尝试使用函数,xpath等。)
  • 在shell中,键入view(response)。这将打开响应scrapy进入您的默认浏览器。
  • 页面加载完毕后,您应该可以看到没有作业列表。这是因为它们是通过POST-Request加载的。

我们如何找出它的要求? (我使用Firebug for FireFox,不知道它在Chrome上是如何工作的)

  • 点击萤火虫(例如右键点击一个元素并点击Inspect with Firebug。这会打开Firebug,这与Chrome中的开发者工具基本相似。我更喜欢它。
  • 您可以在此处点击Network - 标签。如果没有,请重新加载页面。
  • 现在,您应该能够看到加载作业列表的请求。

在这种情况下,对https://www.germanystartupjobs.com/jm-ajax/get_listings/的请求会返回一个JSON - 对象(点击JSON),其中包含HTML代码。

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

您可以通过导入蜘蛛顶部的json - 模块然后执行以下操作来执行此操作:

data = json.loads(response.body)
html = data['html']
selector = scrapy.Selector(text=data['html'], type="html")

例如,如果您要从网站中提取所有网址并关注它们,则需要指定xpath,找到网址的位置并yield新请求到这个网址。所以基本上你是在告诉scrapy&#34;看,这里是网址,现在去关注它&#34;。

xpath的一个例子是:

url = selector.xpath('//a/@href').extract()

所以括号中的所有内容都是你的xpath。您不需要指定ul[@id="job-listing-view"]/左右的所有路径,您只需要确保它是可识别的路径。例如,我们只在a - 标记中包含您想要的网址,网站上没有其他a标记。

这几乎是基本的东西。

我强烈建议你在shell中玩游戏,直到你感觉到你的xpath为止。拿一个看起来很简单的网站,没有任何请求,看看你是否可以通过xpath找到你想要的任何元素。