Python爬蟲框架Scrapy介紹加實戰專案
Python爬蟲框架Scrapy介紹加實戰專案
Scrapy框架是非同步處理框架,可配置和可擴充套件程度非常高,是Python中使用最廣泛的爬蟲框架,這個框架非常的強大,幾乎能用來配合任何爬蟲專案。
專案要求:爬取騰訊招聘上的招聘資訊(連結: link.)
爬取資料要求:需要爬取,職位名稱、職位連結、職位類別、招聘人數、工作地點、釋出時間
簡單介紹一下樓主的的環境 python3.6.4 + Windows +Anacodnda 4.4.10
1.開始一個 Scrapy 專案
安裝 Scrapy : 在Windows中使用Anacodnda安裝是最方便的,不知道Anacodnda的自己百度
Anacodnda中安裝命令:conda install scrapy
cmd::建議安裝pip 使用 pip install Scrapy安裝專案 (注意許可權問題)
Linux環境下:sudo pip3 install Scrapy (需要下面配置響應的依賴環境)
Mac OS:下載安裝包,配置環境變數
在安裝成功後就可以開始自己的第一個Scrapy專案
在(Anacodnda)終端命令下輸入:scrapy startproject 專案名稱 可以新建專案
(base) C:\Users\Python>scrapy startproject Tengxun
命令執行後,會建立一個Tencent資料夾,結構如下 Tengxun/ ├── scrapy.cfg #專案基本配置檔案,不用修改 └── Tengxun ├── __init__.py #專案初始化函式,可以用來配置專案環境,匯入模組 ├── items.py # 定義爬取資料的結構 ├── middlewares.py # 下載器中介軟體和蜘蛛中介軟體實現 ├── pipelines.py # 處理資料 ├── settings.py # 專案全域性配置 └── spiders # 存放自己爬蟲程式 ├── __init__.py
2.根據專案要求編寫items.py檔案,根據需要爬取的內容定義爬取欄位
import scrapy
class TengxunItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# 職位名稱
zhName = scrapy.Field()
# 職位連結
zhLink = scrapy.Field()
# 職位類別
zhType = scrapy.Field()
# 招聘人數
zhNum = scrapy.Field()
# 工作地點
zhAddress = scrapy.Field()
# 工作時間
zhTime = scrapy.Field()
'''scrapy.Field()是用來建立需要爬取欄位,可以接受的值沒有任何限制,設定Field物件
的主要目就是在一個地方定義好所有的元資料'''
3.進入Tencent目錄,使用命令建立一個基礎爬蟲類並編寫:
(base) (base) C:\Users\Python\Tengxun\Tengxun>scrapy genspider tengxun hr.tencent.com
請注意在 Linux 環境中 域名需要增加引號
執行命令後會在spiders資料夾中建立一個tengxun.py的檔案,現在開始對其編寫:
# -*- coding: utf-8 -*-
import scrapy
from Tengxun.items import TengxunItem
class TengxunSpider(scrapy.Spider):
"""
功能:爬取騰訊招聘具體資訊
"""
# 爬蟲名
name = 'tengxun'
allowed_domains = ['hr.tencent.com']
# 定義1個基準的url,方便後期拼接290個URL
url = "https://hr.tencent.com/position.php?start="
#start初始值,用於拼接url
start = 0
# 拼接初始的url
start_urls = [url + str(start)]
# parse函式是第1次從start_urls中初始URL發請求後
# 得到響應後必須要呼叫的函式
def parse(self, response):
for i in range(0,2891,10):
# scrapy.Request()
# 把290頁的URL給排程器入佇列,然後出佇列給下載器
yield scrapy.Request\
(self.url + str(i),
callback=self.parseHtml)
#callback設定回撥函式
def parseHtml(self,response):
# 每個職位的節點物件列表,通過響應物件xpth方法匹配獲取
baseList = response.xpath('//tr[@class="odd"] | //tr[@class="even"]')
for base in baseList:
# 初始化模型物件
item = TengxunItem()
# 匹配頁面中的具體招聘職位
item["zhName"] = base.xpath('./td[1]/a/text()').extract()[0]
# 匹配具體連結
item["zhLink"] = base.xpath('./td[1]/a/@href').extract()[0]
# 匹配具體職位類別,經過測試,這個欄位可能在網頁中沒有值,由此增加判斷,增加預設值
item["zhType"] = base.xpath('./td[2]/text()').extract()
if item["zhType"]:
item["zhType"] = item["zhType"][0]
else:
item["zhType"] = "無"
# 匹配具體招聘人數
item["zhNum"] = base.xpath('./td[3]/text()').extract()[0]
# 匹配具體工作地點
item["zhAddress"]= base.xpath('./td[4]/text()').extract()[0]
# 匹配具體釋出時間
item["zhTime"] = base.xpath('./td[5]/text()').extract()[0]
# 每次迴圈生成一個物件
yield item
4.編寫pipelines.py專案管道檔案
pipelines.py是專案管道檔案,主要用於資料的處理,例如:將資料存入MySQL資料庫,或者存入csv檔案等,具體儲存資料的方式可自定。為了簡化程式碼,本文僅列印一下在終端輸出方便理解。
class TengxunPrintPipeline(object):
'''管道檔名稱,可以自己定義,定義完需要在settings.py中新增設定'''
def process_item(self, item, spider):
'''處理資料的函式,名稱不能改變'''
print("=================")
print('職位名稱:' + item["zhName"])
print('職位連結:' + item["zhLink"])
print('職位型別:' + item["zhType"])
print('招聘人數:' + item["zhNum"])
print('工作地點:' + item["zhAddress"])
print('釋出時間:' + item["zhTime"])
print("=================")
# 返回物件,可以繼續寫下一個pipeline類處理資料
return item
5.settings.py檔案設定
Windows環境下建立的專案沒有新增User-Agent、指定如何處理資料等,具體設定可能需要根據專案來定,本文僅演示一些必須設定的地方
# 設定請求頭部,新增url
DEFAULT_REQUEST_HEADERS = {
'User-Agent':'Mozilla/5.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
#不遵循robots協議
ROBOTSTXT_OBEY = False
# 設定管道檔案 指定處理資料
ITEM_PIPELINES = {
'Tengxun.pipelines.TengxunPrintPipeline': 300,
#指定管道檔案處理資料,可以指定多個,按照優先順序依次執行,300代表優先順序,數字越大,優先順序越低
}
6.在spiders資料夾中執行命令
C:\Users\Python\Tengxun\Tengxun\spiders>srcapy crawl tengxun
執行結果
部分資料
本文僅僅用於演示交流,原始碼地址 github.
原始碼加入了兩個管道檔案可以用mysql與mangodb資料庫儲存資料,有興趣的朋友可以自己去下載看看