Scrapy框架爬取豆瓣
阿新 • • 發佈:2022-05-26
Scrapy框架爬取豆瓣
下載Scrapy
- 下載命令
conda install scrapy(使用這個命令必須安裝Anaconda) - 驗證是否安裝成功
在cmd視窗輸入【scrapy】,回車,出現使用方法表示安裝成功
使用Scrapy框架爬取豆瓣
-
新建專案
在預備建立專案的路徑下開啟cmd視窗,輸入命令scrapy startproject project01,建立一個名為project01的專案,專案的目錄結構如下。 -
編輯爬蟲
-
在spider下新建一個top250.py檔案
top250.py
import scrapy import bs4 from ..items import Project01Item class DoubanSpider(scrapy.Spider): # 定義一個爬蟲類DoubanSpider name = 'book_douban' # name是定義爬蟲的名字,這個名字是爬蟲的唯一標識。 # name = 'book_douban'意思是定義爬蟲的名字為book_douban。 # 等會我們啟動爬蟲的時候,要用到這個名字。 allowed_domains = ['book.douban.com'] # allowed_domains是定義允許爬蟲爬取的網址域名(不需要加https://)。 # 如果網址的域名不在這個列表裡,就會被過濾掉。 start_urls = ['https://book.douban.com/top250?start=0'] # start_urls是定義起始網址,就是爬蟲從哪個網址開始抓取。 # 並且allowed_domains的設定對start_urls裡的網址不會有影響。 # for x in range(3): # url = f'https://book.douban.com/top250?start={x * 25}' # start_urls.append(url) def parse(self, response): # parse是預設處理response的方法 bs = bs4.BeautifulSoup(response.text, 'html.parser') # 用BeautifulSoup解析response datas = bs.find_all('tr', class_="item") # 用find_all提取<tr class="item">元素,這個元素裡含有書籍資訊 for data in datas: # 遍歷data item = Project01Item() # 例項化DoubanItem這個類 item['title'] = data.find_all('a')[1]['title'] # 提取出書名,並把這個資料放回DoubanItem類的title屬性裡 item['publish'] = data.find('p', class_='pl').text # 提取出出版資訊,並把這個資料放回DoubanItem類的publish裡 item['score'] = data.find('span', class_='rating_nums').text # 提取出評分,並把這個資料放回DoubanItem類的score屬性裡。 print(item['title']) # 列印書名 yield item # yield item是把獲得的item傳遞給引擎
-
編輯item.py檔案
item.py
import scrapy class Project01Item(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 定義書名的資料屬性 title = scrapy.Field() # 定義出版資訊的資料屬性 publish = scrapy.Field() # 定義評分的資料屬性 score = scrapy.Field() pass
-
更新部分setting.py設定
setting.py
# Crawl responsibly by identifying yourself (and your website) on the user-agent USER_AGENT = 'project01 (+http://www.yourdomain.com)' # Obey robots.txt rules ROBOTSTXT_OBEY = True # 遵循robots協議 LOG_LEVEL = 'WARNING' # 設定log列印等級,篩選列印資訊
-
-
執行爬蟲
根目錄下新建一個main.py執行程式即可輸出列印資訊main.py
from scrapy import cmdline #匯入cmdline模組,可以實現控制終端命令列 cmdline.execute(['scrapy','crawl','book_douban']) #用execute()方法,輸入執行scrapy的命令
Scrapy呼叫分析
參考連結:https://blog.csdn.net/qq_38486203/article/details/80349491
-
Scrapy流程圖
-
執行步驟
先明確對應關係
SPIDERS -- spiders\top250.py
ITEM PIPLINES -- item.py & piplines.py
MIDDLEWARE -- middlewares.py
- spiders向爬蟲引擎發出初始請求'''https://book.douban.com/top250?start=0'''
- 爬蟲引擎將請求'''https://book.douban.com/top250?start=0'''放入排程器佇列
- 排程器返回請求URL'''https://book.douban.com/top250?start=0'''給爬蟲引擎
- 爬蟲引擎請求下載'''https://book.douban.com/top250?start=0'''
- 下載器將從INTERNET中下載的資料(此處為HTML)返回給爬蟲引擎
- 爬蟲引擎將下載的資料通過中介軟體交給spiders處理(通過bs4獲取item的屬性title,publish, score)
- 爬蟲通過中介軟體返回處理後的items,以及新的請求給引擎。
- items的值就存放在ITEM PIPLINES中,可以在piplines.py中print(items)得到相應結果。出現列印資訊的前提是在setting.py中開啟item_piplines。'''ITEM_PIPELINES = {'project01.pipelines.Project01Pipeline': 300,}''',新的請求則放入排程器的佇列中。