簡介
這次的爬蟲訓練是對豆瓣top250信息的爬取,比較簡單的靜態頁面的爬取,本人也是初學者,爲了防止學習的困難,我儘量寫的詳細點,建議先把代碼複製一遍,看能不能成功運行,再過來看,免得到時候全部看完了,代碼不能運行,到時候自己解決也是蠻麻煩的,畢竟爬蟲更新換代也是蠻快的
目標需求
對豆瓣top250所有信息進行爬取,包括影名、格言、評分,先存爲.csv文件,最後轉爲excel表格存儲
運用知識
requests庫,lxml解析庫,csv文件保存
分析
1.進入到豆瓣top250主界面,進行如下操作,基本得到了我們需要信息的源碼
2.分析每一頁的url,找出相應規律
第一頁:
第二頁:
我們發現start=0和start=25有所不同,其餘都是一樣的,我們陸續查看後面幾頁url,發現start的值以25遞增,由此我們可以推出各頁的url
源碼部分
有部分註釋
import requests
import csv
from lxml import etree
# 得到第i頁的源代碼
def get_resource(page): # 傳入參數爲頁數
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
} # 設置請求頭
page_head=page*25
page_url = 'https://movie.douban.com/top250?start=%d&filter=' % page_head # 得到每頁的url
try:
response = requests.get(page_url, headers=headers) # 加個請求頭,僞裝一下,否則會被識別出來,具體錯誤可看返回的狀態碼
response.raise_for_status() # 若返回狀態碼不是200,則拋出異常
response.encoding =response.apparent_encoding # 設置編碼格式和網站編碼格式相同,防止後面亂碼
except Exception as e:
print('爬取失敗')
else:
return response.text # 爬取成功,則返回該頁源碼信息
#信息處理,並寫入csv文件
def handle_info(i,selector):
selector = etree.HTML(selector) # 構造一個xpath解析對象
number = selector.xpath('//em/text()')
name = selector.xpath('//span[@class="title"][1]/text()')
motto = selector.xpath('//span[@class="inq"]/text()')
score = selector.xpath('//span[@class="rating_num"]/text()')
# 多次調試後,發現第240,242,247,250個沒有格言,我們把其設置爲空,否則後面會亂
# 第九頁,它們的motto下標分別爲 14,16,21,24
if i==9:
motto.insert(14, " ");
motto.insert(16, " ");
motto.insert(21, " ");
motto.insert(24, " ");
for m in range(25):
all_info = [number[m], name[m], motto[m], score[m]] # 形成列表,後面插入
with open('douban_top250.csv', 'a+', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(all_info) # 按行寫入
if __name__=='__main__':
# 寫入第一行,確定每列名稱
with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['number', 'name', 'motto', 'score'])
# 一共10頁
for i in range(0,10):
selector=get_resource(i)
handle_info(i,selector)
代碼部分額外解釋
- name = selector.xpath(’//span[@class=“title”][1]/text()’):
在span標籤,且其class屬性值爲title,有兩個滿足該條件的,我們取第一個,text()表示取其文本值 - motto = selector.xpath(’//span[@class=“inq”]/text()’):
在span標籤,且其class屬性值爲inq,text()表示取其文本值 - with open(‘douban_top250.csv’, ‘a+’, newline=’’, encoding=‘utf-8’) as csvfile:該句中newline=’’,防止每寫入一行,就插入一個空行,encoding='utf-8’保證編碼格式的統一
實現效果
解決excel打開csv文件亂碼,並保存爲excel文件
pycharm中打開csv文件:
excel文件:
結語
本程序中對lxml未得到的格言,手動查找,以空格賦值,不是很恰當,我也是想不出什麼好辦法,才這麼寫的,有其他解決辦法,望告知!