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)基於管道的持久化儲存
明天更。。。。。。。。。