1. 程式人生 > >scrapy抓取拉勾網職位資訊(四)——對欄位進行提取

scrapy抓取拉勾網職位資訊(四)——對欄位進行提取

上一篇中已經分析了詳情頁的url規則,並且對items.py檔案進行了編寫,定義了我們需要提取的欄位,本篇將具體的items欄位提取出來

這裡主要是涉及到選擇器的一些用法,如果不是很熟,可以參考:scrapy選擇器的使用


 

依舊是在lagou_c.py檔案中編寫程式碼

首先是匯入LagouItem類,因為兩個__init__.py檔案的存在,所在的資料夾可以作為python包來使用

from lagou.items import LagouItem

 

編寫parse_item()函式(同樣為了詳細解釋,又是一波註釋風暴):

 def
parse_item(self, response): item = LagouItem() #生成一個item物件 item['url'] = response.url #這個response是詳情頁面的response,因為本次我們只對詳情頁面使用了回撥函式,所以可以這樣理解 item['name'] = response.css('.name::text').extract_first() #用css選擇器選擇職位名稱,因為結果是個列表,所以使用extract_first()提取第一個 item['salary'] = response.css('
.salary::text').extract_first() #用css選擇器選擇薪水,但是這個是一個string型別,後續可以進行優化 location = response.xpath('//*[@class="job_request"]//span[2]/text()').extract_first() #使用xpath進行提取,span[2]代表多個平行span標籤選擇第二個 item['location'] = self.remove_splash(location) #得到的文字帶有/,還有多餘的空格,使用remove_splash函式進行清除,當然這個函式需要自己定義 work_exp
= response.xpath('//*[@class="job_request"]//span[3]/text()').extract_first() #獲取工作經驗要求 item['work_exp'] = self.remove_splash(work_exp) #使用remove_splash對資料清洗 edu_background = response.xpath('//*[@class="job_request"]//span[4]/text()').extract_first() #獲取學歷要求 item['edu_background'] = self.remove_splash(edu_background) item['type'] = response.xpath('//*[@class="job_request"]//span[5]/text()').extract_first() #獲取職位型別,全職or兼職 tags = response.css('.labels::text').extract() #tags是一個列表型別,直接使用extract()進行提取,而不使用extract_first() item['tags'] = ','.join(tags) #join函式是python內建函式,作用是把一個序列拼接起來,這裡是用逗號把所有的tags標籤拼接起來構成一個新的列表 item['release_time'] = response.css('.publish_time::text').extract_first() #獲取釋出時間,實際上這個釋出時間存在很多種情況,有具體日期,也有幾天前這種,後續進行優化 advantage = response.css('.job-advantage p::text').extract() #職位誘惑 item['advantage'] = '\n'.join(advantage) #用join進行拼接 job_desc = response.css('.job_bt p::text').extract() #獲取職位描述 item['job_desc'] = '\n'.join(job_desc) work_addr = response.css('.work_addr a::text').extract()[:-1] #這個工作地址列表提取出來後,需要把最後一項去掉,最後一項是地圖。。 item['work_addr'] = ''.join(work_addr) item['company'] = response.css('.job_company img::attr(alt)').extract_first() #獲取公司名稱 yield item

 

編寫remove_splash()函式,這個函式傳入一個值,然後對值中的/替換為空,最後將首尾的空格去掉

    def remove_splash(self,value):
        return value.replace(r'/','').strip()

 

這樣我們就把需要提取的欄位都提取了出來,再次執行爬蟲scrapy crawl lagou_c,控制檯就可以得到類似如下的輸出了


 

但是這抓取速度實在有點太嚇人了。。。很怕被封了IP,要麼限制下載速度,要麼使用代理,我這裡先使用限制下載速度這種措施

在settings.py檔案中,取消DOWNLOAD_DELAY的註釋修改為DOWNLOAD_DELAY = 1。


 

我們啟動爬蟲都是用命令列的方式來實現的,每次輸入命令有點麻煩,這裡我們修改一下

在根目錄下建立一個main.py檔案(說了那麼多次根目錄,其實就是進入專案資料夾後的第一個目錄),程式碼如下:

from scrapy import cmdline

cmdline.execute('scrapy crawl lagou_c'.split())

使用這種方式得到的結果是相同的