1. 程式人生 > >python爬蟲scrapy專案詳解(關注、持續更新)!

python爬蟲scrapy專案詳解(關注、持續更新)!

爬取目標:騰訊招聘網站(起始url:https://hr.tencent.com/position.php?keywords=&tid=0&start)

爬取內容:職位;職位型別;招聘人數;工作地點;釋出時間;招聘詳細連結;工作職責;工作要求

反反爬措施:設定隨機user-agent、設定請求延時操作、

進群:960410445  即可獲取數十套PDF!

1、開始建立專案

1 scrapy startproject tencent

2、進入tencent資料夾,執行啟動spider爬蟲檔案程式碼,編寫爬蟲檔案。

1 scrapy genspider hr "tencent.com"

命令執行完,用Python最好的IDE---pycharm開啟該檔案目錄,會在你的當前目錄建立如下檔案目錄。

python爬蟲scrapy專案詳解(關注、持續更新)!

 

3、編寫該目錄下的items.py檔案,設定你需要爬取的欄位。

 1 class TencentItem(scrapy.Item):
 2 # define the fields for your item here like:
 3 # 職位
 4 position = scrapy.Field()
 5 # 職位型別
 6 position_type = scrapy.Field()
 7 # 招聘人數
 8 persons = scrapy.Field()
 9 # 工作地點
10 place = scrapy.Field()
11 # 招聘釋出時間
12 time = scrapy.Field()
13 # 職位詳細連結
14 detail_link = scrapy.Field()
15 # 工作職責
16 work_duty = scrapy.Field()
17 # 工作要求
18 work_request = scrapy.Field()

4、進入spiders資料夾,開啟hr.py檔案,開始編寫爬蟲檔案

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 import re
 4 from items import TencentItem
 5 
 6 class HrSpider(scrapy.Spider):
 7 name = 'hr'
 8 allowed_domains = ['tencent.com']
 9 offset = 0
10 original_url = 'https://hr.tencent.com/position.php?keywords=&tid=0&start='
11 # 設定動態起始url
12 start_urls = ['https://hr.tencent.com/position.php?keywords=&tid=0&start=' + str(offset)]
13 
14 def parse(self, response):
15 # 編寫xpath規則提取需要的資料,進行資料清洗。
16 trs = response.xpath("//table[@class='tablelist']//tr")[1:-1]
17 for tr in trs:
18 item = TencentItem()
19 item["position"] = tr.xpath("./td[1]/a/text()").extract()
20 item["position_type"] = tr.xpath("./td[2]/text()").extract()
21 item["persons"] = tr.xpath("./td[3]/text()").extract()
22 item["place"] = tr.xpath("./td[4]/text()").extract()
23 item["time"] = tr.xpath("./td[5]/text()").extract()
24 link_part = tr.xpath("./td[1]/a/@href").extract_first()
25 # 分析網址結構,拼接正確的職位詳細連結
26 url_detail = item["detail_link"] = 'https://hr.tencent.com/' + link_part
27 # 將找到的詳細連結yield 到scrapy的排程器,排程器進行入佇列,依次傳送請求。
28 yield scrapy.Request(url=url_detail,
29 callback=self.parse_next_url,#編寫處理連結的回撥函式
30 meta = {"item":item},
31 )
32 # 進行翻頁操作
33 if self.offset < 2870:
34 self.offset += 10
35 url_send = self.original_url + str(self.offset)
36 yield scrapy.Request(
37 url=url_send,
38 callback=self.parse,
39 )
40 # 編寫回調函式
41 def parse_next_url(self,response):
42 item = response.meta["item"]
43 item["work_duty"] = response.xpath("//table[@class='tablelist textl']//tr[3]//ul//text()").extract()
44 item["work_request"] = response.xpath("//table[@class='tablelist textl']//tr[4]//ul//text()").extract()
45 item["work_duty"] = re.sub(r'(\xa0)','',str(item["work_duty"]))
46 item["work_request"] = re.sub(r'(\xa0)','',str(item["work_request"]))
47 yield item

5、編寫pipeline.py檔案,處理接收到的資料

 1 import json
 2 
 3
 4 class TencentPipeline(object):
 5 # 自定義一個開啟檔案,寫入檔案的方式儲存資料
 6 def __init__(self):
 7 self.f = open("tencent.json","wb")
 8 
 9 def process_item(self, item, spider):
10 # 當item檔案中有中文時,ensure預設是用ascii編碼中文
11 content = json.dumps(dict(item),ensure_ascii= False) + ", 
"
12 self.f.write(content.encode("utf-8"))
13 return item
14 
15 def close_file(self):
16 self.f.close()

6、設定setting.py檔案,配置scrapy執行的相關內容

DOWNLOADER_MIDDLEWARES = {
 'tencent.middlewares.RandomUA': 543,
}
ITEM_PIPELINES = {
 'tencent.pipelines.TencentPipeline': 300,
 # 'scrapy_redis.pipelines.RedisPipeline': 400,
}
USER_AGENT = [
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
 "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
 "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
 "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
 "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
 "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
 "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
 "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
# 設定請求延時操作
DOWNLOAD_DELAY = 1

7、設定middlewares.py檔案,對請求進行處理。

class RandomUA(object):
# 設定隨機請求頭
 def process_request(self,request,spider):
 UA = random.choice(USER_AGENT)
 request.headers["user-agent"] = UA

8、設定爬蟲的啟動檔案start.py

1 from scrapy.cmdline import execute
2 execute("scrapy crawl hr".split())

9、執行效果如下。(儲存為json資料格式的字串到本地)

 1 {"position": ["25928-高階圖形開發工程師(深圳總部)"], "position_type": ["技術類"], "persons": ["3"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46479&keywords=&tid=0&lid=0", "work_duty": "['負責遊戲引擎圖形相關特性的開發;', '負責渲染流程和演算法的優化,以及相關工具的開發;', '負責圖形相容性分析以及疑難問題的分析定位工作。']", "work_request": "['本科以上學歷,精通C/C++,具備紮實的資料結構和演算法基礎,熟悉常用設計模式;', '具備計算機圖形學知識,熟練掌握3D圖形渲染技術,熟悉OpenGL以及Shader開發;', '熟練掌握3D遊戲引擎架構, 熟悉3D引擎的介面和遊戲製作流程;', '3年以上3D引擎(Unreal、Unity等)開發經驗,一年以上渲染相關開發和優化經驗;', '深刻理解客戶端框架和其他核心模組的實現,有主導過核心模組的開發經驗者優先;', '熟悉移動端GPU/CPU架構,有移動端渲染開發經驗者優先;', '責任心強,善於溝通,對遊戲前沿技術應用抱有熱情。']"}, 
 2 {"position": ["25667-渠道銷售經理(深圳)"], "position_type": ["市場類"], "persons": ["2"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46485&keywords=&tid=0&lid=0", "work_duty": "['擔任騰訊雲渠道經理,負責區域渠道體系建設及產品銷售;', '定期拜訪渠道合作伙伴,充分了解客戶需求並積極跟進,制定合理方案,負責方案提示、談判,追蹤公司相關部門的工作,保證方案的有效實施;', '維持與現有合作伙伴的良好業務關係,及時更新公司產品資訊,傳達企業及品牌文化。']", "work_request": "['本科及以上學歷,計算機、電信、市場營銷或其它相關專業;', '軟體或網際網路行業五年以上相關工作經驗;', '具有豐富的渠道銷售、區域管理及長尾中小企業客戶覆蓋經驗;', '具有企業級應用軟體銷售經驗,具有云計算及網際網路行業渠道銷售經驗優先;', '能夠有效通過渠道覆蓋中長尾客戶,承擔區域銷售業績;', '能夠建立區域渠道體系,有效處理渠道衝突與風險防範;', '能夠主導制定各種服務與激勵方式,持續提高渠道合作伙伴的滿意度;', '具有出色的協調能力,良好的團隊合作精神;為人誠信,工作敬業,有責任心。']"}, 
 3 {"position": ["28481-醫療健康UI開發工程師(深圳)"], "position_type": ["設計類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46476&keywords=&tid=0&lid=0", "work_duty": "['負責騰訊覓影,智慧醫院等相關醫療產品的前端元件的編寫,web開發工作;', '根據產品與設計要求,不斷優化前端架構,改善使用者體驗。參與相關UI元件體系的建立、維護等。']", "work_request": "['網頁重構或web前端開發工作2年以上; ', '精通HTML5,CSS3,JavaScript構建高效能web應用;掌握React或Vue並有相關實戰經驗,掌握主流前端構建工具grunt,gulp,webpack;', '精通UI元件化開發、動效開發、響應式、多終端適配、無障礙有一定開發經驗;', '有node.js/vue/react開發經驗者優先,有前端效能、工具研發方面的實踐經驗優先。', '對Web效能、安全相關有一定的瞭解; ', '有創新精神並能積極學習業界新技術,順暢的溝通合作能力。']"}, 
 4 {"position": ["SA-騰訊社交廣告高階系統測試工程師(研發中心 北京)"], "position_type": ["技術類"], "persons": ["1"], "place": ["北京"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46486&keywords=&tid=0&lid=0", "work_duty": "['參與網際網路軟體產品測試的全流程,包括參與需求分析、設計評審,制定測試計劃,設計和執行測試用例,進行缺陷跟蹤和軟體質量分析等;', '制定測試計劃,構建測試環境,執行整合測試,迴歸測試等; ', '保證被測系統的質量,並通過測試流程和方法創新,努力提升研發的質量和效率。']", "work_request": "['工科、計算機或其他相關專業本科以上學歷;', '熟悉C/C++/Java等至少一種程式語言,有Shell或Ruby/PHP/Perl/Python等使用經驗者優先;', '至少1年以上軟體開發、自動化測試工作經驗;', '有效能、安全、白盒測試等專業測試領域經驗者優先;', '具備網際網路廣告、搜尋、大資料處理、分散式系統、資料庫和網路等業務領域測試經驗者優先; ', '熟悉Linux或Unix作業系統;', '精通測試流程和測試用例設計方法,能主動進行技術鑽研;', '解決複雜問題和編寫自動測試工具和系統的能力;', '很強的邏輯思維能力,談判的能力和衝突管理的能力;', '善於團隊合作,理解和適應變化,以結果和行動為準則,努力追求成功。']"}, 
 5 {"position": ["25664-政府行業交付專案經理"], "position_type": ["產品/專案類"], "persons": ["2"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46484&keywords=&tid=0&lid=0", "work_duty": "['1、負責騰訊雲政府行業的專案交付管理工作;', '2、負責專案資源的組織與協調,確保專案團隊各干係人及內外部合作團隊的協同工作; ', '3、負責專案計劃的制定、跟蹤與維護,確保專案按計劃完成,並解決交付中的各類問題;', '4、協助收集客戶需求和使用者反饋,驅動研發團隊完善產品,確保專案順利通過驗收。']", "work_request": "['1、全日制統招本科及以上學歷,5年以上政府行業經驗,至少深入參與5個政府行業大中型專案;', '2、有在大型企業工作的經歷,管理過20人以上的專案團隊,有豐富的跨部門、跨組織溝通協調經驗,能夠應對複雜的專案環境;', '3、熟悉研發過程,包括產品設計、需求分析、架構設計、開發、測試、運維等,熟悉敏捷開發過程;', '4、有出色的溝通能力和技巧,能夠想方設法推動專案的順利進行,有強烈的結果導向意識;', '5、具備良好的專案管理、客戶關係維護能力,和優秀的溝通技巧,能妥善協調好客戶、合作伙伴、內部團隊的合作關係;', '6、有非常強的事業心、責任感和擔當精神,有較強的抗壓能力,能並行處理多個專案工作,能承受一定程度的出差或駐場工作;', '7、有PMP、ITIL證書者優先,資訊產業部系統整合專案經理證書者優先。']"}, 
 6 {"position": ["PCG14-應用寶資料探勘演算法工程師(深圳)"], "position_type": ["技術類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46483&keywords=&tid=0&lid=0", "work_duty": "['負責提供合適的推薦演算法模型;', '負責研究業內領先的技術,結合騰訊各個業務平臺的資料,根據應用中心和社交渠道這兩個場景給出具體的實驗資料,並且評估結果;', '負責根據不同的演算法模型,上報業務需要的統計資料,協助各種演算法的實施;', '研究已有演算法的瓶頸,提出合理的改進措施和解決方案。']", "work_request": "['計算機、應用數學、人工智慧、模式識別、統計、自控等專業的碩士或者博士優先;', '2年以上相關工作經驗;', '對機器學習、資料探勘演算法及其在網際網路上的應用有比較深入的理解;', '熟悉掌握C/C++語言;', '有大規模分散式計算平臺的使用和並行演算法開發經驗;', '嚴密的數學思維、突出的分析和歸納能力、優秀的溝通表達能力;', '有網際網路廣告,電商,搜尋等方面推薦經驗優先。']"}, 
 7 {"position": ["19867-遊戲後臺開發工程師(深圳)"], "position_type": ["技術類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46482&keywords=&tid=0&lid=0", "work_duty": "['負責遊戲後臺架構設計;', '負責遊戲後臺系統模組以及新特性開發;', '負責伺服器效能優化和體驗優化。']", "work_request": "['2年以上游戲伺服器後臺工作經驗,有完整的專案經驗;', '紮實的程式設計基礎,對高線上大併發遊戲後臺架構有一定認識;', '熟悉Unix/Linux作業系統下的C/C++開發;', '熟悉TCP/IP協議相關知識,熟悉網路程式設計,熟悉資料庫;', '瞭解遊戲伺服器架構及效能優化方法;', '具備良好的分析解決問題能力,能獨立承擔後臺邏輯系統開發工作;', '高度的責任心、良好的溝通能力和團隊合作精神。']"}, 
 8 {"position": ["TME-全民K歌專案經理(深圳)"], "position_type": ["產品/專案類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46478&keywords=&tid=0&lid=0", "work_duty": "['負責全民K歌版本計劃制定,風險監控,過程跟蹤,保障版本目標的實現;', '負責FT內目標確認,目標拆解,資源分配以及目標達成情況跟進,推動各角色協同工作;', '發現、總結、跟蹤過程問題,推動團隊各環節持續改進,提高效率。']", "work_request": "['本科以上學歷,計算機或相關專業;', '3年以上軟體專案管理經驗,有網際網路、軟體領域技術開發經驗優先;', '精通軟體專案過程管理,對敏捷專案管理有實際應用經驗及深刻理解;', '具有良好的執行力和責任心,能推動專案團隊朝目標前進;', '具有豐富的與人溝通、交流和組織能力,出色的團隊合作精神;']"}, 
 9 {"position": ["25928-高階語音演算法工程師(上海)"], "position_type": ["技術類"], "persons": ["1"], "place": ["上海"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46477&keywords=&tid=0&lid=0", "work_duty": "['負責遊戲語音演算法優化;', '負責語音前沿技術研究;', '負責遊戲語音現網版本演算法維護升級。']", "work_request": "['本科及以上學歷;', '熟悉PC/Android/iOS SDK任一平臺C/C++開發,效能優化; ', '熟悉數字訊號處理,數學功底紮實,熟悉MATLAB模擬; ', '熟悉語音前處理演算法AEC,AGC,VAD,NS,CNG,JitterBuffer,Mix等演算法;', '熟悉常見Codec,Opus/AAC/Speex等;', '有AI語音前處理經驗優先;', '熟悉WebRTC,Speex,Opus等開原始碼。']"}, 
10 {"position": ["HY-遊戲發行/運營培訓生(深圳)"], "position_type": ["產品/專案類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46481&keywords=&tid=0&lid=0", "work_duty": "['遊戲發行/運營培訓生專案致力於培養高潛力的遊戲運營人才,以滿足快速增長遊戲業務需求;', '專案採用定製化的培養方式,通過專班學習,名師輔導和專案實戰,提升學員的產品sense、運營能力及通用素質,使學員成為優秀的遊戲發行/運營人才。', '協助專案製作人與研發商共同制定運營目標和工作計劃,約定的各階段遊戲優化、運營開發和運營支援工作;', '推動遊戲研發商的日常溝通,密切關注研發和運營籌備進度同時提供必要協助;', '指導並支援專案組內不同職能員工的日常工作,推動合作部門的目標和工作計劃制定;', '根據專案需求,制定並推廣專案流程規範,確保專案有序推進;', '及時發現並跟蹤解決專案問題,有效管理專案風險。']", "work_request": "['熱愛並樂於體驗遊戲,對研發與運營有一定的瞭解,保持強烈的好奇心和求知慾;', '優秀的中英文讀寫能力;', '積極主動,能夠承受高壓的工作。']"}, 
11 {"position": ["25928-高階圖形開發工程師(上海)"], "position_type": ["技術類"], "persons": ["3"], "place": ["上海"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46480&keywords=&tid=0&lid=0", "work_duty": "['負責遊戲引擎圖形相關特性的開發;', '負責渲染流程和演算法的優化,以及相關工具的開發;', '負責圖形相容性分析以及疑難問題的分析定位工作。']", "work_request": "['本科以上學歷,精通C/C++,具備紮實的資料結構和演算法基礎,熟悉常用設計模式;', '具備計算機圖形學知識,熟練掌握3D圖形渲染技術,熟悉OpenGL以及Shader開發;', '熟練掌握3D遊戲引擎架構, 熟悉3D引擎的介面和遊戲製作流程;', '3年以上3D引擎(Unreal、Unity等)開發經驗,一年以上渲染相關開發和優化經驗;', '深刻理解客戶端框架和其他核心模組的實現,有主導過核心模組的開發經驗者優先;', '熟悉移動端GPU/CPU架構,有移動端渲染開發經驗者優先;', '責任心強,善於溝通,對遊戲前沿技術應用抱有熱情。']"}, 
12 {"position": ["28481-健康保險行業合作高階經理(深圳)"], "position_type": ["市場類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46474&keywords=&tid=0&lid=0", "work_duty": "['1、負責商業保險行業客戶資源拓展(包括不限於保險公司、創新保險平臺、行業協會等專業領域);', '2、拓展相關行業合作伙伴以及合作機構,整合公司已有產品和資源,形成場景化的創新解決方案;', '3、蒐集整理健康保險行業的市場動態、政策變動等行業資訊,解讀反饋助推業務策略制定;', '4、整合資源,設計制定並推進商業合作方案落地,有效撬動行業資源合作。']", "work_request": "['1、全日制本科及以上學歷,三年以上健康保險領域工作經驗;', '2、熟悉保險行業,有健康險創新產品運營經驗或創新平臺運營經驗; ', '3、具備良好的溝通表達能力,清晰的思維邏輯,敏銳的洞察力,較強的自驅力和執行力; ', '4、對工作有高度的責任心和激情,注重團隊合作,適應頻繁差旅需求。']"}, 
13 {"position": ["25928-前端測試開發工程師(深圳)"], "position_type": ["技術類"], "persons": ["1"], "place": ["深圳"], "time": ["2018-12-19"], "detail_link": "https://hr.tencent.com/position_detail.php?id=46473&keywords=&tid=0&lid=0", "work_duty": "['負責平臺類軟體的測試開發工作;', '負責平臺元件的介面測試、單元測試工作;', '能夠在關鍵技術上給予團隊技術指引和支援;', '按時完成安排的移動端開發任務;', '負責與專案組之間的協調,推動工作,幫助專案組推動整個專案質量的提升。']", "work_request": "['本科及以上學歷,計算機相關專業,開發或者測試開發出身,有軟體開發的基礎;', '2-3年以上軟體行業或者網際網路行業經驗,熟悉Windows程式設計或Android/iOS程式設計;', '熟悉軟體開發流程,熟悉Android/iOS環境下自動化測試技術;', '紮實的測試用例設計能力,熟悉主流自動化方法;', '具備紮實的C++、C或Object-C程式設計基礎。', '有以下任意一項經驗者優先:', '較強的DEBUG能力;', '有Android、iOS產品自動化測試經驗。']"}, 
......