在上一篇Scrapy編寫一個簡單爬蟲中,我們簡單介紹了Scrapy的運用,並且僅僅使用了spider這一個文件,而另外的文件都沒有涉及到,顯然Scrapy這個框架並不只具備這麼一點功能,今天這篇文章將介紹一點其他的功能。

運行平臺:Windows

Python版本:Python3.6

IDE: Sublime Text

其他:Chrome瀏覽器

簡述流程為:

步驟1:創建項目

步驟2:Chrome瀏覽器查看相關信息

步驟3:定義Item

步驟4:編寫Spider

步驟5:運行爬蟲並導出數據

我們今天的爬取網站是hr.tencent.com/position

創建項目和上一篇一樣,就不再多說了。

我們通過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的使用。

希望對大家練習有所幫助。


推薦閱讀:
相關文章