前言
小小爬蟲,我……我特喵這是什麼好玩的東西!
520,python陪我過,淦。
你好,我是你親友爲你點的520祝福青蛙,現在我要開始叫了:寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡寡
導入庫
import requests
from bs4 import BeautifulSoup
僞裝頭
headers = {'user-agent': 'Mozilla/5.0'}
爬取主體部分
從豆瓣網看,第一頁start的參數是0,第二頁參數是從25開始
由此可知,這應該是每一頁開頭所代表的第一個電影編號。
所以我們只要用for循環就能弄出所有頁的電影咯
當然在for循環之前我們先找好存儲數據的地方,用一個列表來存儲。
movie_list = []
TOP250,每頁25條,十頁,所以是十個循環
for i in range(0,10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
r.encoding = r.apparent_encoding#防止中文亂碼
r = requests.get(link, headers=headers, timeout= 10) #請求頁面,獲取信息
soup = BeautifulSoup(r.text, "lxml")#熬成soup(解析)
然後我們可以從網頁代碼中看到需要爬取的內容在class=info的裏面
同時在標籤 div中
所以就可以用find_all函數來直接指向這裏
div_list = soup.find_all('div', class_='info')
而我們可以看到,有很多個這樣的標籤,每一個都代表所存的電影信息
所以實際上我們爬取得到的div_list實際上是一個列表!
裏面每一個電影的所有信息都以一個個列表內容存儲,如果我們需要每一個都提取出來,就需要遍歷這個列表。來個for循環吧!
for each in div_list:
提取標題
title = each.find('div', class_='hd').a.span.text.strip()
這代碼意思就是找到class=”hd“,因爲標題內容在class=“hd"裏面。
然後往下就等於找一棵樹的子節點,下面a和span都是標籤名
然後.text是提取text中的內容,也就是我們要的標題內容。
同理,爬取導演主演那一堆。。
info = each.find('div', class_='bd').p.text.strip()
但這時候運行會出現一些問題
出現了很多\xa0
\xa0表示不間斷空白符
我們可以用這條語句將這些東西都轉變成空格
info = info.replace("\n", " ").replace("\xa0", " ")
然後再用info = ’ '.join(info.split())組合起來,這樣就去掉了多的空格
不過慎用,因爲這會去掉所有空格。
但在實踐的過程中發現,不用寫替換語句,直接寫info = ’ '.join(info.split())得到的效果和加上替換語句的效果相同。。。
似乎是split功能過於強大把\n和\xa0直接去掉了?好霸道。
汲取一波營養!
同理獲取剩下的一些評分和人數什麼的
rating = each.find(‘span’, class_=‘rating_num’).text.strip()
num_rating = each.find(‘div’, class_=‘star’).contents[7].text.strip()
什麼?你問我爲什麼是contents[7]?
數這個<>
同理如果contents[3]的話就是評分9.7,嗯哼
然後是評語
try:
quote = each.find('span', class_='inq').text.strip()
except:
quote = ""
然後就是整合起來了
movie_list.append([title, info, rating, num_rating, quote])
最後存入csv文件(一種神奇的格式,既可以用txt打開又能用表格打開)
記得先導入csv庫 import csv
with open('test.csv','w',newline='',encoding='utf-8')as f:
f_csv = csv.writer(f)
for data in movie_list:
f_csv.writerow(data)
亂碼可以用notepad打開轉成ANSI編碼,然後就好嘞。
如果還是亂碼加一行這個,詳情可見
https://blog.csdn.net/Coding___Man/article/details/86552737
import codecs
with open('test.csv', 'ab+') as fileopen:
fileopen.write(codecs.BOM_UTF8) # 爲了防止在windows下直接打開csv文件出現亂碼
整體代碼如下:
import requests
from bs4 import BeautifulSoup
import codecs
import csv
headers = {'user-agent': 'Mozilla/5.0'}
movie_list = []
for i in range(0,10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
r = requests.get(link, headers=headers, timeout= 10)
r.encoding = r.apparent_encoding#防止中文亂碼
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_='info')
for each in div_list:
title = each.find('div', class_='hd').a.span.text.strip()
info = each.find('div', class_='bd').p.text.strip()
info = ' '.join(info.split())
rating = each.find('span', class_='rating_num').text.strip()
num_rating = each.find('div', class_='star').contents[7].text.strip()
try:
quote = each.find('span', class_='inq').text.strip()
except:
quote = ""
movie_list.append([title, info, rating, num_rating, quote])
with open('test.csv', 'ab+') as fileopen:
fileopen.write(codecs.BOM_UTF8) # 爲了防止在windows下直接打開csv文件出現亂碼
with open('test.csv','w',newline='',encoding='utf-8')as f:
f_csv = csv.writer(f)
for data in movie_list:
f_csv.writerow(data)
print("ok")
效果圖: