學好Python不加班系列之SCRAPY爬蟲框架的使用

佟大帥發表於2021-11-09

scrapy是一個爬蟲中封裝好的一個明星框架。具有高效能的持久化儲存,非同步的資料下載,高效能的資料解析,分散式。

對於初學者來說還是需要有一定的基礎作為鋪墊的學習。我將從下方的思維導圖中進行逐步的解析講述。

實驗工具即環境:

  筆記本:Y9000X 2020

  系統:win10

  Python版本:python3.8.6

  pycharm版本:pycharm 2021.1.2(Professional Edition)

 

 

一、安裝

下載tiwisted,此處位下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

下載好後開啟終端進行安裝scrapy的必要模組  

安裝tiwisted,pip install tiwisted-xxxx

安裝pywin32:pip install pywin32 

安裝scrapy:pip install scrapy

安裝完成後在終端輸入scrapy如果沒有報錯即安裝成功。

、建立scrapy的工程

在pycharm中建立好的專案中的中終端輸入

scrapy startproject SDFDQPRO

檢查下專案目錄即可發現多出瞭如下的工程目錄

 

 

三、建立一個爬蟲目錄

在終端找到之前所建立的工程目錄,在此目錄下輸入scrapy genspider sdfdq_cj http://www.csrc.gov.cn/pub/shandong/

後方網站為中國證券監督管理委員會山東監管局。

執行後可發現工程目錄中多出一個名為sdfdq_cj.py的爬蟲檔案。

 進入到爬蟲檔案中可以看到如下程式碼

import scrapy
class SdfdqCjSpider(scrapy.Spider):
    name = 'sdfdq_cj'
    # 表示被允許的url
    # allowed_domains = ['http://www.csrc.gov.cn/pub/shandong/']
    # 起始url列表:該列表中存放的url會被scrapy自動進行請求的傳送
    start_urls = ['http://www.csrc.gov.cn/pub/shandong/sdfdqyxx/']

    # 用作於資料解析:response參數列示的就是請求成功後對應的響應物件
    def parse(self, response):
        pass

接下來對網站解析選取需要獲取的內容

四、資料解析

 

 

 

 通過對網站的檢視可以看出我們需要的是輔導期中的企業基本情況、工作進展報告、工作總結總的標題,日期以及連結。

scrapy對網站的解析沿用了xpath的解析方式。

import scrapy
class SdfdqCjSpider(scrapy.Spider):
    name = 'sdfdq_cj'
    # 表示被允許的url
    # allowed_domains = ['http://www.csrc.gov.cn/pub/shandong/']
    # 起始url列表:該列表中存放的url會被scrapy自動進行請求的傳送
    start_urls = ['http://www.csrc.gov.cn/pub/shandong/sdfdqyxx/']

    # 用作於資料解析:response參數列示的就是請求成功後對應的響應物件
    def parse(self, response):
        
        li_list = response.xpath('//div[@class="zi_er_right"]//div[@class="fl_list"]//li')
        for li in li_list:
            # xpath返回的是列表,但是列元素一定是Selector型別的物件
            # extract可以將Selector物件中的data引數儲存的字串提取出來
            # 列表呼叫了extract之後則表示將列表中每一個data引數儲存的字串提取出來
            title = li.xpath('./a//text()')[0].extract()
            date = li.xpath('./span/text()')[0].extract()
            url = 'http://www.csrc.gov.cn/pub/shandong/sdfdqyxx'+li.xpath('./a/@href').extract_first()
            print('title',title)
            print('url',url)
            print('date',date)

對網站的內容解析後執行scrapy  終端輸入 scrapy crawl sdfdq_cj  注意:此語句的執行目錄

可以看到我們想獲取的內容:

內容獲取到我們必須要將其持久化儲存才有意義:
五、scrapy的持久化儲存

1)基於指令的持久化儲存:

要求:只可以將parse的方法返回值儲存到本地的文字檔案中

    def parse(self, response):
        # 建立一個列表接收穫取的資料
        all_data = []
        li_list = response.xpath('//div[@class="zi_er_right"]//div[@class="fl_list"]//li')
        for li in li_list:
            # xpath返回的是列表,但是列元素一定是Selector型別的物件
            # extract可以將Selector物件中的data引數儲存的字串提取出來
            # 列表呼叫了extract之後則表示將列表中每一個data引數儲存的字串提取出來
            title = li.xpath('./a//text()')[0].extract()
            date = li.xpath('./span/text()')[0].extract()
            url = 'http://www.csrc.gov.cn/pub/shandong/sdfdqyxx'+li.xpath('./a/@href').extract_first()
            # 基於終端指令的持久化儲存操作
            dic = {
                'title':title,
                'url':url,
                'date':date
            }
            all_data.append(dic)
        return all_data

接下來在終端中輸入 scrapy crawl sdfdq_cj -o ./sdfdq.csv

將獲取的文字內容儲存到對應路徑下的sdfdq.csv文字檔案中

 

2)基於管道的持久化儲存

 

 明天更。。。。。。。。。

Auto Copiedscrapy作為一個爬蟲中封裝好的一個明星框架。

 

Auto Copied

相關文章