林觀德



摘要:在信息浩如煙海的大數據時代,如何高效獲取萬維網上所需的信息,是搶占先機的關鍵。文章基于Scrapy的框架及工作原理展開論述,使用Scrapy定向爬取百度社會招聘網站當中的相關招聘信息數據,對所爬取的招聘信息數據進行處理和分析,分析結果可為畢業生就業前收集招聘信息提供參考。
關鍵詞:Scrapy;網絡爬蟲;網頁信息抓取
中圖分類號:TP391.3? ? ? 文獻標識碼:A
文章編號:1009-3044(2020)35-0054-02
開放科學(資源服務)標識碼(OSID):
1 Scrapy簡介
Scrapy是一個為了抓取萬維網上的網頁數據、提取結構性數據而用Python語言編寫的應用框架,該框架是封裝的,對于網站的內容抓取速度非常快捷,并可以下載至本地存儲。Scrapy用途很廣,除數據挖掘外,還可以用于監測和自動化測試。用戶也可以根據需要對其代碼進行修改,快速地抓取網站數據內容,使用起來極為方便[1]。Scrapy架構是由下圖各部分組成(如圖1所示)。
2 Scrapy架構原理
Scrapy Engine 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳送,Scrapy爬取數據處理的工作流程如圖1所示[2]。圖中帶有箭頭方向表示數據流向。
當用戶要爬取某個目標網站的數據,Spiders向Scrapy發出該網站的URL請求。當Scrapy接收到Spiders請求信號后,告知Scheduler把與提取相關的頁面請求排序入隊[3]。
Scheduler接受Scrapy發過來的請求信號,并將該信號按某種方式處理后,再壓URL入隊列中,當再次需要時,還給Scrapy。此時Scheduler繼續送下一個要爬取的URL傳給Scrapy,Scrapy通過Downloader Middlewares將URL轉發給Downloader。
Downloader得到Requests請求,根據指令從頁面上提取需要數據,再將提取響應交還給Scrapy。
Scrapy收到Downloader的響應,通過Spider Middlewares轉給Spiders處理。
Spiders獲取的響應信息經過分析,解析出item字段所要的數據信息,由Pipeline下載完成任務,返回提取的項目內容并處理新的URL請求給Scrapy。
Scrapy告訴Pipeline處理獲取的數據,Pipeline收到由Spiders傳來數據,并對它清理、驗證及存取等。
Scrapy告訴Scheduler新的URL,Downloader收到URL,重復以上操作,至Scheduler的URL隊列為空時,結束Spiders運行。
3 實現Scrapy的爬取URL信息
3.1 主題信息爬取分析
目的:使用scrapy爬取百度社會招聘的信息。
網址:http://hr.baidu.com/external/baidu/index.html#/social/2是百度面向社會招聘信息的網址。通過該網址可以查詢百度招聘職位的相關信息[4]。
使用scrapy框架進行數據的爬取并存儲在本地文件中,分別為items.py、spider以及pipelines.py文件。
3.2 設計爬取招聘信息的主題
1)建立爬蟲項目
編寫Scrapy網絡爬蟲項目。在項目命令行中輸入命令:"scrapy Startproject jobSpider",工程名為jobSpider的爬蟲的工程目錄如圖2所示。
其中:
scrapy.cfg
jobSpider /
jobSpider /items.py
jobSpider /middlewares.py
jobSpider /pipelines.py
jobSpider /settings.py
jobSpider /spiders/:
在jobSpider項目文件夾創建爬蟲spider類文件的命令:"scrapy genspider jobPosition talent.baidu.com"。其中jobPosition是Spider的名稱,"talent.baidu.com"是網站域名。該命令是在"jobSpider/spiders"這個目錄中創建一個jobPosition.py文件,如圖3所示。
2)定義Item要爬取的內容
Item對象是一個簡單的容器,用于收集提取到的數據,根據需要在item.py文件中對提取的數據定義相應的字段,根據百度社會招聘網站(http://hr.baidu.com/external/baidu/index.html),可以獲取職位名稱(MC)、職位類別 (LB)、招聘人數(Num)、工作地點 (Location)、更新時間(T)。根據需要可對自動生成Item.py的源文件爬取內容,然后作的修改符合自己的要求。
3)編寫spider文件
進入jobspider目錄,使用Scrapy genspider命令編寫爬蟲。
Scrapy genspider jobPostion "https://www.baidu.com/",其中“jobPostion”為爬蟲名,https://www.baidu.com為爬蟲作用范圍。執行Scrapy genspider命令后會在spiders文件夾中創建一個jobPostion.py的文件,根據jobPostion.py的源文件作相應修改。部分代碼如下:
#下面的for循環處理爬取一頁的數據
for each in response.xpath("http://tr[@class='even'] | //tr[@class='odd']")
item = jobPostionItem()
item['MC'] = each. Path("./td[1]/a/text()").extract()[0]
item['LB'] = each.xpath("./td[2]/text()").extract()[0]
item['Num'] =each.xpath("./td[3]/text()").extract()[0]
item['Location'] = each.xpath("./td[4]/text()").extract()[0]
item['T'] = each.xpath("./td[5]/text()").extract()[0]
yield item
if self.offset< 1000
self.offset += 10
yield scrapy.Request(self.url + str(self.offset), callback = self.parse)
4) 編寫pipelines.py文件
Import json
Class jobPostionPipeline(object)
def__init__(self)
self.fileName =open("jobPostion.json","w")
def process_item(self, item, spider):
self.f.write(item['href']+'\n')
return item
def close_spider(self,spider)
self.fileName.close()
5) setings.py的設置
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 4
DEFAULT_REQUEST_HEADERS = {
"User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
// 下面是管道配置代碼
ITEM_PIPELINES = {
……
) 執行命令
scrapy crawl jobPostion
即可爬取……
即可爬取……
4 結束語
本文基于Scrapy爬蟲框架實現了一個爬取招聘網站的招聘信息采集,從求職者的角度去進行數據分析,能滿足本項目對招聘信息數據抓取的設計要求[5]。求職者可以通過對不同崗位進行搜索的分析結果,進而判斷招聘信息的有效性及準確性,有利于更好地選擇就業崗位。
參考文獻:
[1] 零一,韓要賓,黃園園.python3爬蟲、數據清洗與可視化實戰[M].北京:電子工業出版社,2018.
[2] 劉宇,鄭成煥.基于Scrapy的深層網絡爬蟲研究[J].軟件,2017,38(7):111-114.
[3] 劉杰,葛曉玢,聞順杰.基于Python的網絡爬蟲系統的設計與實現[J].信息與電腦:理論版,2019(12):92-93,96.
[4] 劉杰,葛曉玢,聞順杰.基于Python的網絡爬蟲系統的設計與實現[J].信息與電腦:理論版,2019(12):92-93,96.
[5] 郭麗蓉.基于Python的網絡爬蟲程序設計[J].電子技術與軟件工程,2017(23):248-249.
【通聯編輯:謝媛媛】