1.找到目標網(wǎng)站
爬取豆瓣排名前250的電影莺治,打開https://movie.douban.com/top250
豆瓣的數(shù)據(jù)都在HTML中
2.分析url是如何變化的并提取有用的url
進入第二頁可見地址欄第二頁的url:https://movie.douban.com/top250?start=25&filter=
以此類推院领,
第三頁:https://movie.douban.com/top250?start=50&filter=
第四頁:https://movie.douban.com/top250?start=75&filter=
......
第十頁:https://movie.douban.com/top250?start=225&filter=
由此推測,第一頁的url是https://movie.douban.com/top250?start=0&filter=
3.使用python模擬瀏覽器向瀏覽器發(fā)送請求
用到的模塊:requests。模塊使用之前要先導入(import requests)
模塊安裝見http://www.reibang.com/p/d4262c8d8af8
進入第一頁蔗喂,按F12進入開發(fā)者模式,network--all--top250?start=0&filter=--headers,獲取url桶唐,和requests方法。
代碼:
# 請求url
url =?https://movie.douban.com/top250?start=0&filter=
# 請求方式為get茉兰,所以用requests.get尤泽,請求url獲得響應
response = requests.get(url)
# 響應狀態(tài)碼測試請求url獲得響應是否成功,結(jié)果為200规脸,則成功坯约,結(jié)果為418則表示被發(fā)現(xiàn)是爬蟲,網(wǎng)站進行了反爬
print(response.status_code)
結(jié)果為418莫鸭,可通過請求頭來偽裝成瀏覽器發(fā)出請求
代碼:
import requests
# 請求url
url =?https://movie.douban.com/top250?start=0&filter=
# 請求頭闹丐,鍵值對形式,加上引號
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
# 請求方式為get被因,所以用requests.get卿拴,請求url獲得響應,添加請求頭偽裝成瀏覽器
response = requests.get(url, headers=headers)
用print(resp.request.headers)可測試請求頭
4.for 循環(huán)獲取10頁數(shù)據(jù)
根據(jù)每頁url的變化規(guī)律梨与,start=(頁數(shù)-1)*25
要獲取10頁數(shù)據(jù)巍棱,編寫循環(huán)
代碼:
import requests
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
for i in range(10):
? ? ?url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
? ? ?response = requests.get(url, headers=headers)
5.提取有用數(shù)據(jù),用網(wǎng)頁解析器beautifulsoup
如何安裝beautifulsoup見http://www.reibang.com/p/d4262c8d8af8
使用之前先導入from bs4 import BeautifulSoup
代碼:
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
for i in range(10):
? ? ?url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
? ? ?response = requests.get(url, headers=headers)
? ? ?# 第一個參數(shù)是要解析的內(nèi)容蛋欣,第二個參數(shù)是解析器
? ? ?bs = BeautifulSoup(response?.text, 'html.parser')
6.尋找有用數(shù)據(jù)
li可能有很多航徙,找它的父元素ol,ol可能有很多陷虎,找它的class到踏。
因此,先找類樣式為grid_view的ol尚猿,再找ol中的所有l(wèi)i
beautifulsoup的語法:對象名.find(標簽, 屬性)窝稿,對象名.find_all(標簽, 屬性)
代碼:
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
for i in range(10):
? ? ?url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
? ? ?response = requests.get(url, headers=headers)
? ? ?bs = BeautifulSoup(response?.text, 'html.parser')
? ? ?#?找類樣式為grid_view的ol
? ? ?grid_view = bs.find('ol', class_='grid_view')
? ? ?# 找ol中的所有l(wèi)i
? ? ?all_li = grid_view.find_all('li')
7.for循環(huán)遍歷li獲取所需數(shù)據(jù):序號,標題凿掂,評分伴榔,推薦語,電影url
找到信息所在標簽和屬性值庄萎,寫代碼
代碼:
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
for i in range(10):
? ? ?url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
? ? ?response = requests.get(url, headers=headers)
? ? ?bs = BeautifulSoup(response?.text, 'html.parser')
? ? ?grid_view = bs.find('ol', class_='grid_view')
? ? ?all_li = grid_view.find_all('li')
? ? ?for item in all_li:
? ? ? ? ? # 獲取序號
? ? ? ? ? no = item.find('em').text
? ? ? ? ? # 獲取標題
? ? ? ? ? title = item.find('span', class_='title').text
? ? ? ? ? #獲取推薦語
? ? ? ? ? inq = item.find('span', class_='inq').text
? ? ? ? ? # 獲取評分
? ? ? ? ? rat = item.find('span', class_='rating_num').text
? ? ? ? ? # 獲取電影url
? ? ? ? ? url_films = item.find('a')['href']
8.存儲數(shù)據(jù)
存儲方式有json踪少,CSV,excel糠涛,mysql援奢,mongdb,redis
本章將數(shù)據(jù)存儲到Excel
為存儲數(shù)據(jù)先定義一個變量lst用于存儲數(shù)據(jù)忍捡,再將數(shù)據(jù)存儲Excel中集漾,要用到openpyxl切黔,安裝方式見http://www.reibang.com/p/d4262c8d8af8
代碼:
import requests
from bs4 import BeautifulSoup
import openpyxl
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
# 定義變量lst,Excel第一行數(shù)據(jù)為'編號', '名稱', '推薦語', '評分', '鏈接地址'
lst=[['編號', '名稱', '推薦語', '評分', '鏈接地址']]
for i in range(10):
? ? ?url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
? ? ?response = requests.get(url, headers=headers)
? ? ?bs = BeautifulSoup(response?.text, 'html.parser')
? ? ?grid_view = bs.find('ol', class_='grid_view')
? ? ?all_li = grid_view.find_all('li')
? ? ?for item in all_li:
? ? ? ? ? no = item.find('em').text
? ? ? ? ? title = item.find('span', class_='title').text
? ? ? ? ? inq = item.find('span', class_='inq').text
? ? ? ? ? rat = item.find('span', class_='rating_num').text
? ? ? ? ? url_films = item.find('a')['href']
? ? ? ? ? # 將數(shù)據(jù)添加到列表中
? ? ? ? ? lst.append([no, title, inq, rat, url_films])
# 先創(chuàng)建一個工作簿xlsx
wb = openpyxl.Workbook()
# 創(chuàng)建工作表sheet
sheet = wb.active
sheet.title = '我的電影'
# 遍歷列表中的數(shù)據(jù)具篇,將數(shù)據(jù)添加到工作表中
for item in lst:
? ? ?sheet.append(item)
# 保存
wb.save('films.xlsx')
9.運行后發(fā)現(xiàn)報錯:attributeerror:‘nonetype’ object has no attribute ‘text’
原因:有部分電影沒有推薦語
修改:添加判斷語句
代碼:
import requests
from bs4 import BeautifulSoup
import openpyxl
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
lst=[['編號', '名稱', '推薦語', '評分', '鏈接地址']]
for i in range(10):
? ? ?url = 'https://movie.douban.com/top250?start='+str(i*25)+'&filter='
? ? ?response = requests.get(url, headers=headers)
? ? ?bs = BeautifulSoup(response?.text, 'html.parser')
? ? ?grid_view = bs.find('ol', class_='grid_view')
? ? ?all_li = grid_view.find_all('li')
? ? ?for item in all_li:
? ? ? ? ? no = item.find('em').text
? ? ? ? ? title = item.find('span', class_='title').text
? ? ? ? ?#刪去.text
? ? ? ? ? inq = item.find('span', class_='inq')
? ? ? ? ? rat = item.find('span', class_='rating_num').text
? ? ? ? ? url_films = item.find('a')['href']
? ? ? ? ?# 添加判斷語句,判斷結(jié)果為true纬霞,賦值inq,否則為空
? ? ? ? ? lst.append([no, title, inq.text if inq!=None else' ', rat, url_films])
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = '我的電影'
for item in lst:
? ? ?sheet.append(item)
wb.save('films.xlsx')