文章首發於 guanngxu 的個人部落格:用scrapy爬取豆瓣top250
最好的學習方式就是輸入之後再輸出,分享乙個自己學習scrapy框架的小案例,方便快速的掌握使用scrapy的基本方法。
本想從零開始寫乙個用scrapy爬取教程,但是官方已經有了樣例,一想已經有了,還是不寫了,盡量分享在網上不太容易找到的東西。自己近期在封閉培訓,更文像蝸牛一樣,抱歉。
scrapy簡介
scrapy是乙個為了爬取**資料,提取結構性資料而編寫的應用框架。 可以應用在包括資料探勘,資訊處理或儲存歷史資料等一系列的程式中。
其最初是為了 頁面抓取 (更確切來說, 網路抓取 )所設計的, 也可以應用在獲取api所返回的資料(例如 amazon associates web services ) 或者通用的網路爬蟲。
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-smtnphgv-1602225022295)(網路爬蟲/scrapy.png)]
如果此前對scrapy沒有了解,請先檢視下面的官方教程鏈結。
架構概覽:
scrapy入門教程:
爬蟲教程
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-6fasrixq-1602225022297)(網路爬蟲/豆瓣top250首頁.png)]
item物件是種簡單的容器,儲存了爬取到得資料。其提供了類似於詞典的api以及用於宣告可用欄位的簡單語法。所以可以宣告item為如下形式。
class
doubanitem
(scrapy.item)
:# 排名
ranking = scrapy.field(
)# 電影名稱
title = scrapy.field(
)# 評分
score = scrapy.field(
) pople_num = scrapy.field(
)# 導演
director = scrapy.field(
)# 年份
year = scrapy.field(
)# 地區
area = scrapy.field(
)# 型別
clazz = scrapy.field(
)# 電影描述
decsription = scrapy.field(
)
我們抓取到相應的網頁後,需要從網頁中提取自己需要的資訊,可以使用xpath語法,我使用的是beautifulsoup網頁解析器,經過beautifulsoup解析的網頁,可以直接使用選擇器篩選需要的資訊。有一些說明寫到**注釋裡面去了,就不再贅述。
chrome 也可以直接複製選擇器或者xpath,如下圖所示。
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-syqxx9kq-1602225022299)(網路爬蟲/複製選擇器.png)]
class
douban_spider
(spider)
: count =
1# 爬蟲啟動命令
name =
'douban'
# 頭部資訊,偽裝自己不是爬蟲程式
headers =
# 爬蟲啟動鏈結
defstart_requests
(self)
: url =
''yield request(url, headers=self.headers)
# 處理爬取的資料
defparse
(self, response)
:print
('第'
, self.count,
'頁')
self.count +=
1 item = doubanitem(
) soup = beautifulsoup(response.text,
'html.parser'
)# 選出電影列表
movies = soup.select(
'#content div div.article ol li'
)for movie in movies:
item[
'title'
]= movie.select(
'.title')[
0].text
item[
'ranking'
]= movie.select(
'em')[
0].text
item[
'score'
]= movie.select(
'.rating_num')[
0].text
item[
'pople_num'
]= movie.select(
'.star span')[
3].text
# 包含導演、年份、地區、類別
info = movie.select(
'.bd p')[
0].text
director = info.strip(
).split(
'\n')[
0].split(
' '
) yac = info.strip(
).split(
'\n')[
1].strip(
).split(
' / '
) item[
'director'
]= director[0]
.split(
': ')[
1]item[
'year'
]= yac[0]
item[
'area'
]= yac[1]
item[
'clazz'
]= yac[2]
# 電影描述有為空的,所以需要判斷
iflen
(movie.select(
'.inq'))
isnot0:
item[
'decsription'
]= movie.select(
'.inq')[
0].text
else
: item[
'decsription']=
'none'
yield item
# 2,自己根據url規律構造位址,這裡使用的是第二種方法
next_url = soup.select(
'.paginator .next a')[
0]['href'
]if next_url:
next_url =
''+ next_url
yield request(next_url, headers=self.headers)
然後在專案資料夾內開啟cmd命令,執行scrapy crawl douban -o movies.csv
就會發現提取的資訊就寫入指定檔案了,下面是爬取的結果,效果很理想。
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-tpvl1vqx-1602225022300)(網路爬蟲/爬取結果.png)]
完整**:
python爬蟲之scrapy爬取豆瓣電影(練習)
開發環境 windows pycharm mongodb scrapy 任務目標 任務目標 爬取 豆瓣電影top250 將資料儲存到mongodb中。items.py檔案 coding utf 8 define here the models for your scraped items see d...
爬蟲 豆瓣電影爬取案例
直接上 僅供參考。目標爬取資料是某地區的 正在上映 部分的資料,如下圖 完整 如下 usr bin python coding utf 8 from lxml import etree import requests 目標 爬取豆瓣深圳地區的 正在上映 部分的資料 注意點 1 如果網頁採用的編碼方式...
scrapy框架爬取豆瓣讀書(1)
scrapy,python開發的乙個快速 高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料。scrapy用途廣泛,可以用於資料探勘 監測和自動化測試。scrapy吸引人的地方在於它是乙個框架,任何人都可以根據需求方便的修改。它也提供了多種型別爬蟲的基類,如basespi...