上次說到電視劇集的列表資訊是通過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有兩種,乙個要付費...