林觀德
摘要:在信息浩如煙海的大數(shù)據(jù)時代,如何高效獲取萬維網(wǎng)上所需的信息,是搶占先機的關鍵。文章基于Scrapy的框架及工作原理展開論述,使用Scrapy定向爬取百度社會招聘網(wǎng)站當中的相關招聘信息數(shù)據(jù),對所爬取的招聘信息數(shù)據(jù)進行處理和分析,分析結果可為畢業(yè)生就業(yè)前收集招聘信息提供參考。
關鍵詞:Scrapy;網(wǎng)絡爬蟲;網(wǎng)頁信息抓取
中圖分類號:TP391.3? ? ? 文獻標識碼:A
文章編號:1009-3044(2020)35-0054-02
開放科學(資源服務)標識碼(OSID):
1 Scrapy簡介
Scrapy是一個為了抓取萬維網(wǎng)上的網(wǎng)頁數(shù)據(jù)、提取結構性數(shù)據(jù)而用Python語言編寫的應用框架,該框架是封裝的,對于網(wǎng)站的內(nèi)容抓取速度非??旖荩⒖梢韵螺d至本地存儲。Scrapy用途很廣,除數(shù)據(jù)挖掘外,還可以用于監(jiān)測和自動化測試。用戶也可以根據(jù)需要對其代碼進行修改,快速地抓取網(wǎng)站數(shù)據(jù)內(nèi)容,使用起來極為方便[1]。Scrapy架構是由下圖各部分組成(如圖1所示)。
2 Scrapy架構原理
Scrapy Engine 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數(shù)據(jù)傳送,Scrapy爬取數(shù)據(jù)處理的工作流程如圖1所示[2]。圖中帶有箭頭方向表示數(shù)據(jù)流向。
當用戶要爬取某個目標網(wǎng)站的數(shù)據(jù),Spiders向Scrapy發(fā)出該網(wǎng)站的URL請求。當Scrapy接收到Spiders請求信號后,告知Scheduler把與提取相關的頁面請求排序入隊[3]。
Scheduler接受Scrapy發(fā)過來的請求信號,并將該信號按某種方式處理后,再壓URL入隊列中,當再次需要時,還給Scrapy。此時Scheduler繼續(xù)送下一個要爬取的URL傳給Scrapy,Scrapy通過Downloader Middlewares將URL轉發(fā)給Downloader。
Downloader得到Requests請求,根據(jù)指令從頁面上提取需要數(shù)據(jù),再將提取響應交還給Scrapy。
Scrapy收到Downloader的響應,通過Spider Middlewares轉給Spiders處理。
Spiders獲取的響應信息經(jīng)過分析,解析出item字段所要的數(shù)據(jù)信息,由Pipeline下載完成任務,返回提取的項目內(nèi)容并處理新的URL請求給Scrapy。
Scrapy告訴Pipeline處理獲取的數(shù)據(jù),Pipeline收到由Spiders傳來數(shù)據(jù),并對它清理、驗證及存取等。
Scrapy告訴Scheduler新的URL,Downloader收到URL,重復以上操作,至Scheduler的URL隊列為空時,結束Spiders運行。
3 實現(xiàn)Scrapy的爬取URL信息
3.1 主題信息爬取分析
目的:使用scrapy爬取百度社會招聘的信息。
網(wǎng)址:http://hr.baidu.com/external/baidu/index.html#/social/2是百度面向社會招聘信息的網(wǎng)址。通過該網(wǎng)址可以查詢百度招聘職位的相關信息[4]。
使用scrapy框架進行數(shù)據(jù)的爬取并存儲在本地文件中,分別為items.py、spider以及pipelines.py文件。
3.2 設計爬取招聘信息的主題
1)建立爬蟲項目
編寫Scrapy網(wǎng)絡爬蟲項目。在項目命令行中輸入命令:"scrapy Startproject jobSpider",工程名為jobSpider的爬蟲的工程目錄如圖2所示。
其中:
scrapy.cfg
jobSpider /
jobSpider /items.py
jobSpider /middlewares.py
jobSpider /pipelines.py
jobSpider /settings.py
jobSpider /spiders/:
在jobSpider項目文件夾創(chuàng)建爬蟲spider類文件的命令:"scrapy genspider jobPosition talent.baidu.com"。其中jobPosition是Spider的名稱,"talent.baidu.com"是網(wǎng)站域名。該命令是在"jobSpider/spiders"這個目錄中創(chuàng)建一個jobPosition.py文件,如圖3所示。
2)定義Item要爬取的內(nèi)容
Item對象是一個簡單的容器,用于收集提取到的數(shù)據(jù),根據(jù)需要在item.py文件中對提取的數(shù)據(jù)定義相應的字段,根據(jù)百度社會招聘網(wǎng)站(http://hr.baidu.com/external/baidu/index.html),可以獲取職位名稱(MC)、職位類別 (LB)、招聘人數(shù)(Num)、工作地點 (Location)、更新時間(T)。根據(jù)需要可對自動生成Item.py的源文件爬取內(nèi)容,然后作的修改符合自己的要求。
3)編寫spider文件
進入jobspider目錄,使用Scrapy genspider命令編寫爬蟲。
Scrapy genspider jobPostion "https://www.baidu.com/",其中“jobPostion”為爬蟲名,https://www.baidu.com為爬蟲作用范圍。執(zhí)行Scrapy genspider命令后會在spiders文件夾中創(chuàng)建一個jobPostion.py的文件,根據(jù)jobPostion.py的源文件作相應修改。部分代碼如下:
#下面的for循環(huán)處理爬取一頁的數(shù)據(jù)
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 = {
……
) 執(zhí)行命令
scrapy crawl jobPostion
即可爬取……
即可爬取……
4 結束語
本文基于Scrapy爬蟲框架實現(xiàn)了一個爬取招聘網(wǎng)站的招聘信息采集,從求職者的角度去進行數(shù)據(jù)分析,能滿足本項目對招聘信息數(shù)據(jù)抓取的設計要求[5]。求職者可以通過對不同崗位進行搜索的分析結果,進而判斷招聘信息的有效性及準確性,有利于更好地選擇就業(yè)崗位。
參考文獻:
[1] 零一,韓要賓,黃園園.python3爬蟲、數(shù)據(jù)清洗與可視化實戰(zhàn)[M].北京:電子工業(yè)出版社,2018.
[2] 劉宇,鄭成煥.基于Scrapy的深層網(wǎng)絡爬蟲研究[J].軟件,2017,38(7):111-114.
[3] 劉杰,葛曉玢,聞順杰.基于Python的網(wǎng)絡爬蟲系統(tǒng)的設計與實現(xiàn)[J].信息與電腦:理論版,2019(12):92-93,96.
[4] 劉杰,葛曉玢,聞順杰.基于Python的網(wǎng)絡爬蟲系統(tǒng)的設計與實現(xiàn)[J].信息與電腦:理論版,2019(12):92-93,96.
[5] 郭麗蓉.基于Python的網(wǎng)絡爬蟲程序設計[J].電子技術與軟件工程,2017(23):248-249.
【通聯(lián)編輯:謝媛媛】