2016-12-15 57 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