2016-12-15 58 views
1

我是新来的scrapy,但使用python一段时间。我从scrapy文档以及xpath选择器中吸取了教训。现在,我想将知识转化为一个小项目。我正尝试使用scrapy从作业板https://www.germanystartupjobs.com/中取消job links and the associated info like job title, location, emails (if any), phone numbers (if any)如何使用scrapy获取href和相关信息?

我有这样的起动代码,

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功能,我想获得的parse_detail函数内href S和细节。

的时候,我跟chrome开发工具打开提到的页面,并检查列出的作业,我看到所有的工作都是在这里面ul

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

,然后,将中隔离作业中所列出的许多的

<div class="job-info-row-listing-class">与关联的相关信息divs,也就是说,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之后,我仍然在使用xpaths。如何找到链接和相关信息?一些示例代码很少有解释,将会有所帮助。

我尝试使用代码

# 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

回答

2

你可能不能够提取本网站上的信息蜘蛛后至今返回任何结果,因为实际的工作列表将作为POST请求加载。

你怎么知道这个?

  • 类型scrapy shell "https://www.germanystartupjobs.com/"在您的终端选择。 (这个打开了,你猜对了,shell,这是非常值得推荐的,当你第一次开始抓网页的时候,你可以试试函数,xpath等)。这会打开响应scrapy正在进入默认浏览器。
  • 页面加载完成后,您应该能够看到没有任何工作列表。这是因为它们是通过POST请求加载的。

我们如何知道它是什么要求? (我用Firefox的Firebug的工作,不知道它是如何工作在Chrome)

  • 观察Firebug(例如,通过右键单击元素并单击Inspect with Firebug。这打开了Firebug的,基本上是像Chrome开发工具。我喜欢它。
  • 在这里,您可以点击Network -Tab。如果什么都没有,重新加载页面。
  • 现在,你应该能够看到与该职位列表加载的要求。

在这种情况下, st到https://www.germanystartupjobs.com/jm-ajax/get_listings/返回一个JSON -object(点击JSON),其HTML代码为aprt。

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

您可以通过进口你的蜘蛛的顶部做到这一点json - 模,然后沿着线的东西:

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

举例来说,如果你想从该网站提取所有网址并遵循它们,您需要指定xpath,在哪里找到url以及yield对此URL的新请求。所以基本上你是告诉scrapy“看,这里是网址,现在去吧,跟着它”。

了一个XPath的一个例子是:

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

所以一切都在括号中是你的XPath。你不需要指定从ul[@id="job-listing-view"]/左右的所有路径,你只需要确保它是一个可识别的路径。在这里,例如,我们只有a标签上的网址,您不需要在网站上有其他a标签。

这几乎是基本的东西。

我强烈建议你在shell中玩耍,直到你感觉到你的xpaths挂起。以一个看起来很容易的网站,没有任何请求,并看看你是否可以通过XPath找到任何你想要的元素。

+0

感谢您的回答,这真的很有帮助。我发布了另一个与'scrapy'相关的问题,可能会对你有所帮助'http:// stackoverflow.com/questions/41178659/how-to-get-the-job-description-using-scrapy' – Chak