Python爬蟲基礎練習(十七)Scrapy爬取Tencent職位信息
在上一篇Scrapy編寫一個簡單爬蟲中,我們簡單介紹了Scrapy的運用,並且僅僅使用了spider這一個文件,而另外的文件都沒有涉及到,顯然Scrapy這個框架並不只具備這麼一點功能,今天這篇文章將介紹一點其他的功能。
運行平臺:Windows
Python版本:Python3.6
IDE: Sublime Text
其他:Chrome瀏覽器
簡述流程為:
步驟1:創建項目
步驟2:Chrome瀏覽器查看相關信息
步驟3:定義Item
步驟4:編寫Spider
步驟5:運行爬蟲並導出數據
我們今天的爬取網站是https://hr.tencent.com/position.php?&start=0#a
創建項目和上一篇一樣,就不再多說了。
我們通過Chrome瀏覽器查看一下相關信息,我們要爬取的數據分別為職位名稱,職位鏈接,職位類別、職位人數、職位地點以及發布時間,它們的html信息如圖所示:
可以看到,職位信息塊分佈在class為「odd」或者「even」的div中,我們所需要的信息分別分佈在不同的td中。
在編寫Spider前,我們可以先定義一個Item,用於封裝職位信息。
在項目文件夾的根目錄中找到item.py文件,輸入以下代碼
在這裡,我們自定義了一個數據類,用來封裝爬取到的數據,這個類繼承了Item基類,並且通過Field創建了一系列對象,用於描述欄位名。
看上去和我們上一個練習中使用Python字典沒什麼區別,但使用Item可以很直接的看到我們爬取的欄位信息,而且Item會提供對欄位名的檢測,並且Field可以攜帶元數據,傳遞給其他組件。
定義好Item後,就可以編寫Spider了,Spider的編寫和上一篇文章的區別不大,代碼如下:
# -*- coding: utf-8 -*-
import re
import scrapy
from tencent.items import TencentItem
class TencentsSpider(scrapy.Spider):
# 爬蟲標識
name = tencents
# 允許爬取的區域
allowed_domains = [tencent.com]
# 爬取的起始鏈接
start_urls = ["http://hr.tencent.com/position.php?&start=0#a"]
def parse(self, response):
# 提取信息
# 獲取單個職位塊狀元素
datas = response.xpath(//tr[@class="even"]|//tr[@class="odd"])
for data in datas:
item = TencentItem()
# 職位名稱
position_name = data.xpath(./td[1]/a/text()).extract_first()
# 職位鏈接
position_link = data.xpath(./td[1]/a/@href).extract_first()
# 職位類別
position_info = data.xpath(./td[2]/text()).extract_first()
# 職位人數
position_number = data.xpath(./td[3]/text()).extract_first()
# 職位地點
position_location = data.xpath(./td[4]/text()).extract_first()
# 發布時間
publishi_time = data.xpath(./td[5]/text()).extract_first()
item[position_name] = position_name
item[position_link] = position_link
item[position_info] = position_info
item[position_number] = position_number
item[position_location] = position_location
item[publishi_time] = publishi_time
# 構造下一頁鏈接
page = re.search((d+),response.url).group(1)
count = int(page) +10
url = re.sub(d+, str(count), response.url)
# 將獲取到的數據交給pipeline
yield item
# 發送新的請求加入待爬頁面,並使用回調函數self.parse
yield scrapy.Request(url,callback=self.parse)
同樣是找到一個包含職位信息的塊,需要注意的一點是由於職位信息分佈在兩種不同class的div中,所以在使用Xpath時需要用到路徑表達式,將兩種class都選擇出來。然後遍歷循環,提取信息,然後將爬取到的數據封裝進TencentItem中,在構建下一頁鏈接的時候用到的是正則表達式,然後組合鏈接再重新發送請求。
最後輸入scrapy crawl tencent,得到數據如下:
如果不想在命令行執行,可以在根目錄設置一個run文件,代碼如下:
from scrapy.cmdline import execute
import os
import sys
sys.path.append(os.path.join(os.getcwd()))
execute("scrapy crawl tencents".split())
在execute裏寫入之前在命令行中的語句就行,同樣可以輸出json,csv文件。
這樣就可以在Sublime Text中看到執行結果了
今天這個案例簡單介紹了Item封裝數據,再次熟悉了Scrapy的使用。
希望對大家練習有所幫助。
推薦閱讀: