1. 程式人生 > >Python爬蟲框架Scrapy介紹加實戰專案

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,方便後期拼接290URL
    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資料庫儲存資料,有興趣的朋友可以自己去下載看看