溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息

發(fā)布時(shí)間:2023-03-30 11:49:16 來(lái)源:億速云 閱讀:120 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息”吧!

安裝方法:Windows:在終端輸入命令:pip install scrapy;mac:在終端輸入命令:pip3 install scrapy,按下enter鍵,再輸入cd Python,就能跳轉(zhuǎn)到Python文件夾。接著輸入cd Pythoncode,就能跳轉(zhuǎn)到Python文件夾里的Pythoncode子文件夾。最后輸入一行能幫我們創(chuàng)建Scrapy項(xiàng)目的命令:scrapy startproject douban,douban就是Scrapy項(xiàng)目的名字。按下enter鍵,一個(gè)Scrapy項(xiàng)目就創(chuàng)建成功了。

項(xiàng)目目標(biāo):

爬取豆瓣讀書(shū)Top250的書(shū)名,出版信息和評(píng)分

目標(biāo)url為:https://book.douban.com/top250?start=0
整個(gè)scrapy項(xiàng)目的結(jié)構(gòu),如下圖

如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息

spiders是放置爬蟲(chóng)的目錄。我們?cè)趕piders這個(gè)文件夾里創(chuàng)建爬蟲(chóng)文件,我們把這個(gè)文件命名為top250,大部分代碼都需要在這個(gè)top250.py文件里編寫(xiě)。在top250.py文件里導(dǎo)入我們需要的模塊:import scrapy , bs4
導(dǎo)入scrapy是我們要用創(chuàng)建類的方式寫(xiě)這個(gè)爬蟲(chóng),我們所創(chuàng)建的類將直接繼承scrapy中的scrapy.Spider類。這樣,有許多好用屬性和方法,就能夠直接使用。

在Scrapy中,每個(gè)爬蟲(chóng)的代碼結(jié)構(gòu)基本都如下所示:

class DoubanSpider(scrapy.Spider): #定義一個(gè)爬蟲(chóng)類DoubanSpider,DoubanSpider類繼承自scrapy.Spider類。
    name = 'douban'  #定義爬蟲(chóng)的名字,這個(gè)名字是爬蟲(chóng)的唯一標(biāo)識(shí)。
    allowed_domains = ['book.douban.com']#定義允許爬蟲(chóng)爬取的網(wǎng)址域名(不需要加https://)。如果網(wǎng)址的域名不在這個(gè)列表里,就會(huì)被過(guò)濾掉。allowed_domains就限制了,我們這種關(guān)聯(lián)爬取的URL,一定在book.douban.com這個(gè)域名之下,不會(huì)跳轉(zhuǎn)到某個(gè)奇怪的廣告頁(yè)面。
    start_urls = ['https://book.douban.com/top250?start=0']#定義起始網(wǎng)址,就是爬蟲(chóng)從哪個(gè)網(wǎng)址開(kāi)始抓取
    
    def parse(self, response):#parse是Scrapy里默認(rèn)處理response的一個(gè)方法,中文是解析。
        print(response.text)
#這里我們并不需要寫(xiě)類似requests.get()的語(yǔ)句,scrapy框架會(huì)為我們代勞做這件事,寫(xiě)好你的請(qǐng)求,接下來(lái)你就可以直接寫(xiě)對(duì)響應(yīng)如何做處理

每一次,當(dāng)數(shù)據(jù)完成記錄,它會(huì)離開(kāi)spiders,來(lái)到Scrapy Engine(引擎),引擎將它送入Item Pipeline(數(shù)據(jù)管道)處理。定義這個(gè)類的py文件,正是items.py。
如果要爬取豆瓣讀書(shū)的書(shū)名、出版信息和評(píng)分,示例:

在items.py里如何定義數(shù)據(jù):

import scrapy
#導(dǎo)入scrapy
class DoubanItem(scrapy.Item):
#定義一個(gè)類DoubanItem,它繼承自scrapy.Item
    title = scrapy.Field()
    #定義書(shū)名的數(shù)據(jù)屬性
    publish = scrapy.Field()
    #定義出版信息的數(shù)據(jù)屬性
    score = scrapy.Field()
    #定義評(píng)分的數(shù)據(jù)屬性

scrapy.Field()這行代碼實(shí)現(xiàn)的是,讓數(shù)據(jù)能以類似字典的形式記錄,它輸出的結(jié)果非常像字典,但它卻并不是dict,它的數(shù)據(jù)類型是我們定義的DoubanItem,屬于自定義的Python字典.我們利用類似上述代碼的樣式,去重新寫(xiě)top250.py

import scrapy
import bs4
from ..items import DoubanItem
# 需要引用DoubanItem,它在items里面。因?yàn)槭莍tems在top250.py的上一級(jí)目錄,所以要用..items,這是一個(gè)固定用法。

class DoubanSpider(scrapy.Spider):
#定義一個(gè)爬蟲(chóng)類DoubanSpider。
    name = 'douban'
    #定義爬蟲(chóng)的名字為douban。
    allowed_domains = ['book.douban.com']
    #定義爬蟲(chóng)爬取網(wǎng)址的域名。
    start_urls = []
    #定義起始網(wǎng)址。
    for x in range(3):
        url = 'https://book.douban.com/top250?start=' + str(x * 25)
        start_urls.append(url)
        #把豆瓣Top250圖書(shū)的前3頁(yè)網(wǎng)址添加進(jìn)start_urls。

    def parse(self, response):
    #parse是默認(rèn)處理response的方法。
        bs = bs4.BeautifulSoup(response.text,'html.parser')
        #用BeautifulSoup解析response。
        datas = bs.find_all('tr',class_="item")
        #用find_all提取<tr class="item">元素,這個(gè)元素里含有書(shū)籍信息。
        for data in  datas:
        #遍歷data。
            item = DoubanItem()
            #實(shí)例化DoubanItem這個(gè)類。
            item['title'] = data.find_all('a')[1]['title']
            #提取出書(shū)名,并把這個(gè)數(shù)據(jù)放回DoubanItem類的title屬性里。
            item['publish'] = data.find('p',class_='pl').text
            #提取出出版信息,并把這個(gè)數(shù)據(jù)放回DoubanItem類的publish里。
            item['score'] = data.find('span',class_='rating_nums').text
            #提取出評(píng)分,并把這個(gè)數(shù)據(jù)放回DoubanItem類的score屬性里。
            print(item['title'])
            #打印書(shū)名。
            yield item
            #yield item是把獲得的item傳遞給引擎。

當(dāng)我們每一次,要記錄數(shù)據(jù)的時(shí)候,比如前面在每一個(gè)最小循環(huán)里,都要記錄“書(shū)名”,“出版信息”,“評(píng)分”。我們會(huì)實(shí)例化一個(gè)item對(duì)象,利用這個(gè)對(duì)象來(lái)記錄數(shù)據(jù)。
每一次,當(dāng)數(shù)據(jù)完成記錄,它會(huì)離開(kāi)spiders,來(lái)到Scrapy Engine(引擎),引擎將它送入Item Pipeline(數(shù)據(jù)管道)處理。這里,要用到y(tǒng)ield語(yǔ)句。
yield語(yǔ)句它有點(diǎn)類似return,不過(guò)它和return不同的點(diǎn)在于,它不會(huì)結(jié)束函數(shù),且能多次返回信息。

如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息

就如同上圖所示:爬蟲(chóng)(Spiders)會(huì)把豆瓣的10個(gè)網(wǎng)址封裝成requests對(duì)象,引擎會(huì)從爬蟲(chóng)(Spiders)里提取出requests對(duì)象,再交給調(diào)度器(Scheduler),讓調(diào)度器把這些requests對(duì)象排序處理。然后引擎再把經(jīng)過(guò)調(diào)度器處理的requests對(duì)象發(fā)給下載器(Downloader),下載器會(huì)立馬按照引擎的命令爬取,并把response返回給引擎。
緊接著引擎就會(huì)把response發(fā)回給爬蟲(chóng)(Spiders),這時(shí)爬蟲(chóng)會(huì)啟動(dòng)默認(rèn)的處理response的parse方法,解析和提取出書(shū)籍信息的數(shù)據(jù),使用item做記錄,返回給引擎。引擎將它送入Item Pipeline(數(shù)據(jù)管道)處理。

代碼實(shí)操&mdash;&mdash;設(shè)置

點(diǎn)擊settings.py文件,把USER _AGENT的注釋取消(刪除#),然后替換掉user-agent的內(nèi)容,就是修改了請(qǐng)求頭。
因?yàn)镾crapy是遵守robots協(xié)議的,如果是robots協(xié)議禁止爬取的內(nèi)容,Scrapy也會(huì)默認(rèn)不去爬取,所以修改Scrapy中的默認(rèn)設(shè)置。把ROBOTSTXT_OBEY=True改成ROBOTSTXT_OBEY=False,就是把遵守robots協(xié)議換成無(wú)需遵從robots協(xié)議,這樣Scrapy就能不受限制地運(yùn)行。

1.

想要運(yùn)行Scrapy有兩種方法,一種是在本地電腦的終端跳轉(zhuǎn)到scrapy項(xiàng)目的文件夾

(跳轉(zhuǎn)方法:cd+文件夾的路徑名如:
cd D:\python\Pythoncode\douban\douban)
然后輸入命令行:scrapy crawl douban(douban 就是我們爬蟲(chóng)的名字)。)

2.

另一種運(yùn)行方式需要我們?cè)谧钔鈱拥拇笪募A里新建一個(gè)main.py文件(與scrapy.cfg同級(jí))。

然后在這個(gè)main.py文件里,輸入以下代碼,點(diǎn)擊運(yùn)行,Scrapy的程序就會(huì)啟動(dòng)。

from scrapy import cmdline
#導(dǎo)入cmdline模塊,可以實(shí)現(xiàn)控制終端命令行。
cmdline.execute(['scrapy','crawl','douban'])
#用execute()方法,輸入運(yùn)行scrapy的命令。

第1行代碼:在Scrapy中有一個(gè)可以控制終端命令的模塊cmdline。導(dǎo)入了這個(gè)模塊,我們就能操控終端。
第2行代碼:在cmdline模塊中,有一個(gè)execute方法能執(zhí)行終端的命令行,不過(guò)這個(gè)方法需要傳入列表的參數(shù)。我們想輸入運(yùn)行Scrapy的代碼scrapy crawl douban,就需要寫(xiě)成[&lsquo;scrapy&rsquo;,&lsquo;crawl&rsquo;,&lsquo;douban&rsquo;]這樣。
在實(shí)際項(xiàng)目實(shí)戰(zhàn)中,我們應(yīng)該先定義數(shù)據(jù),再寫(xiě)爬蟲(chóng)。所以,流程圖應(yīng)如下:

如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息

最后,存儲(chǔ)數(shù)據(jù)需要修改pipelines.py文件

感謝各位的閱讀,以上就是“如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)如何用scrapy框架爬取豆瓣讀書(shū)Top250的書(shū)類信息這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI