七夕快到了,和女朋友看什么片好呢?我迫不及待地拿出我的Python,
需求分析
- 爬取豆瓣電影分類排行榜
- 保存至本地
準備作業
安裝 requests 和 pyquery 庫:
快捷鍵 Windows+r 打開運行控制框,輸入 cmd,進入命令列,輸入:
pip install requests
pip install pyquery
匯入:
import requests
from pyquery import PyQuery as pq
網頁決議與請求
打開網址:https://movie.douban.com/chart
第一步:爬取分類關鍵字
我們首先要爬取電影分類的文字資訊:

我們首先要發送 get 請求獲得 html 原始碼并決議,獲取分類資訊,
右鍵,點擊檢查元素,調出開發者模式,我們先點擊Network欄,錄制我們的網路活動,重繪一下網頁,可以看到這里有一個鏈接,就是我們這個網頁的網址:

在這里找到網址和請求頭,當然,請求頭中有許多都是不必要的引數,我們只需要 Cookie、Referer、User-Agent 就可以了,發送請求:
url1 = 'https://movie.douban.com/chart'
headers1 = {
'Cookie': '...',
'Referer': 'https://movie.douban.com/',
'User-Agent': '...'
}
response1 = requests.get(url1, headers=headers1) # 發送請求
獲取到網頁原始碼后,點擊Elements,然后點擊左上角的箭頭,選中分類標簽,尋找該部分的html原始碼:

找到分類標簽的位置后,用 pyquery 決議一下:
typelabels = pq(response1.text).find('.types span a') # 查找節點
typeslist = list(typelabels.items()) # 轉為串列,方便之后的索引
然后我們回圈遍歷串列,列印出序號和關鍵詞,并等待用戶輸入:
for i, n in enumerate(typeslist):
print(str(i) + ':', n.text())
choose = int(input('請選擇:'))
第二步:獲取分類榜單
照樣是點擊Network欄,錄制我們的網路活動,這次我們點擊一個分類,進入分類界面,可以看到這里有一個鏈接,就是我們進行請求的網址,Preview 里有我們需要的榜單,注意這里會有兩個類似的網址,注意區分:


但是請求的引數我們無法獲取:

這時候要說一下,我們在發送請求時,一般地址中問號后面的可以省略,是因為問號后面的即是請求引數,我們發送 params 資訊就不需要后面的引數了,params 設定發送請求時所帶的引數,字典或位元組流格式,作為額外引數連接到url中(問號后的部分),既然這樣,那么我們也可以反過來,在地址中放入引數,就能夠省略掉 params 了,
我們可以發現,在網頁源代碼的分類標簽中,href 屬性里面有鏈接后綴:

這時候我們只需將請求的網址'https://movie.douban.com/j/chart/top_list'和后綴除/typerank的部分連接起來,就能夠得到需要的地址:
add = typeslist[choose].attr('href')
url2 = 'https://movie.douban.com/j/chart/top_list' + add.lstrip('/typerank')
#'https://movie.douban.com/j/chart/top_list?type_name=劇情&type=11&interval_id=100:90&action='
最后發送 get 請求,獲取榜單資訊,并不需要params傳入引數:
headers2 = {
'Cookie': '...',
'Referer': 'https://movie.douban.com/typerank',
'User-Agent': '...'
}
response2 = requests.get(url=url2, headers=headers2)
然后再篩選出需要的資訊,列印出來:
for i, n in enumerate(response2.json()):
print(i+1, n['title'] + ' ' + n['rating'][0] + '【' + ','.join(n['types']) + '】', sep=' ')
#列印排名、名稱、評分及影片型別
效果:

完整代碼
from pyquery import PyQuery as pq
import requests
url1 = 'https://movie.douban.com/chart'
headers1 = {
'Cookie': '...',
'Referer': 'https://movie.douban.com/',
'User-Agent': '...'
}
response1 = requests.get(url1, headers=headers1) # 第一次請求,獲取關鍵詞
typelabels = pq(response1.text).find('.types span a') # 查找節點
typeslist = list(typelabels.items()) # 轉為串列,方便之后的索引
for i, n in enumerate(typeslist):
print(str(i) + ':', n.text()) # 列印關鍵詞
choose = int(input('請選擇:'))
add = typeslist[choose].attr('href')
url2 = 'https://movie.douban.com/j/chart/top_list' + add.lstrip('/typerank') # 合并生成url
headers2 = {
'Cookie': '...',
'Referer': 'https://movie.douban.com/typerank',
'User-Agent': '...'
}
response2 = requests.get(url=url2, headers=headers2) # 第二次請求,獲取榜單
for i, n in enumerate(response2.json()): # 列印榜單/
print(i, n['title'] + ' ' + n['rating'][0] + '【' + ','.join(n['types']) + '】', sep=' ')
選:保存到本地
一般來說,以上的功能就足以滿足查詢的需要,但有時候我們也想要把它保存下來,以下是爬取并保存的完整代碼:
import requests
from pyquery import PyQuery as pq
import xlwt
# 新建作業簿
wb = xlwt.Workbook(encoding='utf-8')
url1 = 'https://movie.douban.com/chart'
headers1 = {
'Cookie': '...',
'Referer': 'https://movie.douban.com/',
'User-Agent': '...'
}
response1 = requests.get(url1, headers=headers1).text
typelabels = pq(response1.text).find('.types span a') # 查找節點
typeslist = list(typelabels.items()) # 轉為串列,方便之后的索引
headers2 = {
'Cookie': '...',
'Referer': 'https://movie.douban.com/typerank',
'User-Agent': '...'
}
for j in typeslist:
# 新建作業表
ws = wb.add_sheet(i.text, cell_overwrite_ok=True)
#發送請求
add = i.attr('href')
url2 = 'https://movie.douban.com/j/chart/top_list' + add.lstrip('/typerank')
response2 = requests.get(url=url2, headers=headers2)
#提取有用資訊
datas = [[i+1, n['title'], n['rating'][0], '【' + ','.join(n['types']) + '】'] for i, n in enumerate(response2.json())]
# 將表頭和內容合并
table += [j for i in datas for j in i]
# 填入內容
for i, n in enumerate(table):
ws.write(i // 4, i % 4, n)
# 保存作業表
wb.save('豆瓣電影分類排行榜.xls')
效果:

溫馨提示:爬取并保存全部,所耗費的時間過長,請耐心等待……

– the End –
以上就是我分享的全部內容,感謝閱讀!
作者提供片子榜單,但不提供女朋友!
本文收錄于專欄:Python爬蟲
關注作者,持續閱讀作者的文章,學習更多Python知識!
https://blog.csdn.net/weixin_52132159
2021/8/8
推薦閱讀
- Python爬蟲 | 爬取b站北京奧運會開幕式彈幕,有多少人從東京奧運會跑過來的?
- 絕密!Python爬蟲告訴你刷分機器人背后的原理!這篇文章差點沒過審
- Python每天一道題:昆蟲繁殖問題?我把密密麻麻的幼蟲和成蟲搞定了
- 沒想到我連五年級的題目都解不出來?可不能被人小看,讓萬能的Python登場
- Python:程式猿怎么追女生?教你短短幾行代碼表白,告別表白尷尬!
- 想學Python不知從何入手?學習Python必備秘籍,附地址,速拿!
- Python標準庫:datetime 時間和日期模塊 —— 時間的獲取和操作詳解
- 學習筆記 | PyInstaller 使用教程——用pyinstaller打包exe應用程式【建議收藏!】
- 【Python爬蟲】爬蟲利器 requests 庫小結(建議收藏!)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/292730.html
標籤:python
上一篇:3 個可以使你的 Python 代碼更優雅、可讀、直觀和易于維護的工具
下一篇:Python 字典(一)
