爬蟲畢設(四) 多頁爬取和資料持久化

2021-10-23 03:39:19 字數 3842 閱讀 4782

上次說到電視劇集的列表資訊是通過ajax網路請求獲取到資料的,當我們開啟頁面的時候,頁面再向另一位址發出請求,得到資料後再渲染到網頁上,我們是在network中找到的目標url。所以說,當我們想要爬取第二頁,第三頁以後的內容所要請求的url都可以在network中找到。

我們請求的目標url是熱門&sort=recommend&page_limit=20&page_start=0,很明顯請求是帶了幾個引數的,在network中找到它。

我們在請求頭的引數裡找到了,總共有五個引數,看字面意思很好理解:

根據對引數的分析,我們只需要改動最後乙個引數就可以了,所以我們就有了思路,在乙個整數列表裡迴圈,得到0、20、40…然後再轉換為字串拼接的前邊的字串中:

str

(x)for x in

range(0

,60,20

)

這裡先爬取三頁的做個示例,加入到__init__()中:

def

__init__

(self,

*args,

**kwargs)

:super

(tvspider, self)

.__init__(

*args,

**kwargs)

self.start_urls =

["熱門&sort=recommend&page_limit=20&page_start="

+str

(x)for x in

range(0

,60,20

)]

輸入每頁所有電視劇集的url,執行結果:

輸出200,並且輸出了60個url。然後注釋掉列印url的**,呼叫解析函式就可以了。

使用pipeline檔案將資料持久化,儲存到json檔案,後期再儲存到資料庫中。

class

tvspiderpipeline

(object):

def__init__

(self)

:# 開啟檔案,二進位制寫入

self.

file

=open

('doubantv.json'

,'wb'

) self.exporter = jsonitemexporter(self.

file

, encoding=

"utf-8"

, ensure_ascii=

false

) self.exporter.start_exporting(

)def

close_spider

(self, spider)

: self.exporter.finish_exporting(

) self.

file

.close(

)def

process_item

(self, item, spider)

: self.exporter.export_item(item)

return item

將pipeline加入到settings檔案中啟用:

item_pipelines =

執行以後,在資料夾中生成乙個doubantv.json的檔案,開啟檔案並格式化,可以看到電視劇集資訊都以json格式寫的整整齊齊。

# meta作為引數傳給後邊呼叫的函式

yield scrapy.request(image_url, meta=

)然後會自動呼叫item_completed函式,這個同樣是不可以改名的:

def

item_completed

(self, results, item, info)

: tv_img_path =

[x['path'

]for ok, x in results if ok]

ifnot tv_img_path:

raise dropitem(

"item contains no images"

) item[

'tv_img_path'

]= tv_img_path

return item

這裡有乙個異常處理,如果沒有,就丟棄掉這個item。

def

file_path

(self, request, response=

none

, info=

none):

# 名與網頁中的一致

url = request.url

file_name = url.split(

'/')[-

1]# 使用劇名命名

# item = request.meta['item']

# title = item['title']

# url = request.url

# file_name = title + '.' + url.split('.')[-1]

return file_name

這裡寫了兩種方法,第一種方法是與網頁中的檔名保持一致,只需要對url使用split()方法就可以。

第二種可以使用電影名作為檔名,但是檔名中含有中文韓文等字元,可能會在後續編碼**現一系列稀奇古怪的問題。(這種方法真的顯得花裡胡哨並且沒有卵用,有部劇的名字太長導致該劇的資訊被丟棄)

在pipelines.py檔案中完成以後同樣要在settings檔案中啟用:

# settings.py

item_pipelines =

# 儲存路徑

images_store =

'd:\\design\\code\\spider\\spider\\image'

# 有效期

images_expires =

30

執行**,結果如下:

missing scheme in request url: h

這個報錯是url的問題,request的引數url是列表型別的,而前邊**裡是字串型別的。

這個報錯是由於python3中這個包已經被pillow代替。

解決辦法:pip install pillow

多頁爬取資料

beautifulsoup自動將輸入文件轉換為unicode編碼,輸出文件轉換為utf 8編碼。你不需要考慮編碼方式,除非文件沒有指定乙個編碼方式,這時,beautifulsoup就不能自動識別編碼方式。這時,你只需要說明一下原始編碼方式就ok。引數用lxml就可以,需要另行安裝並載入。beauti...

python爬蟲爬取多頁內容

前幾天零組資料庫發文關閉,第乙個念頭是可惜,想著趕緊把資料儲存下來,卻發現爬蟲已經忘得差不多了,趕緊複習一波。不多說,pycharm,啟動!不知道爬啥,隨便找個網頁吧 url 首選獲取目標 html頁面 f12提取請求頭資訊,這裡我們只需ua即可 根據網頁 meta標籤設定編碼格式 如下 impor...

爬蟲 爬取多頁資料

最近在寫乙個簡單的爬蟲,最開始使用的是bs4工具,但是後面接觸到xpath,覺得這個比較適合我哈哈.然後用xpath又重新寫了一遍,其中讓我困擾的還是多頁爬取,ip老是被封.網上找了很多方法,大多數都是說要建立乙個ip池,迴圈爬取多頁資料的時候,就換ip這樣就不會被封了.然後 ip有兩種,乙個要付費...