最新豆瓣top250爬蟲案例程式碼分析[注釋齊全]
導入包
# json包
import json
#正則表達式包
import re
import requests
from requests import RequestException
定義爬取html函數
#函數:獲取一頁html
def get_one_page(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
'''
Response對象返回包含了整個伺服器的資源
Response對象的屬性,有以下幾種
r.status_code: HTTP請求的返回狀態,200表示連接成功,404表示失敗
2.r.text: HTTP響應內容的字元串形式,即,url對應的頁面內容
3.r.encoding:從HTTP header中猜測的響應內容編碼方式
4.r.apparent_encoding:從內容中分析出的響應內容編碼方式(備選編碼方式)
5.r.content: HTTP響應內容的二進位形式
'''
response = requests.get(url, headers=headers, timeout=1000)
if response.status_code == 200:
return response.text
except requests.exceptions.RequestException as e:
print(e)
定義解析html函數【正則】
#函數:解析一頁html
def parse_one_page(html):
#re.compile 是預編譯正則表達式函數,是用來優化正則的,它將正則表達式轉化為對象
#re.compile 函數用於編譯正則表達式,生成一個 Pattern 對象,pattern 是一個字元串形式的正則表達式
#pattern 是一個匹配對象Regular Expression,它單獨使用就沒有任何意義,需要和findall(), search(), match()搭配使用。
pattern = re.compile(
'<em class="">(\d+)</em>.*?<a href="(.*?)">.*?' +
'<img width="100" alt=".*?" src="(.*?)" class=""' +
'>.*?<span class="title">(.*?)</span>.*?<span ' +
'class="other"> / (.*?)</span>.*?<div ' +
'class="bd">.*?<p class="">.*?導演: (.*?) .*?<br>' +
'.*?(\d{4}) / (.*?) / (.*?)\n' +
'.*?</p>.*?<span class="rating_num" property="v:' +
'average">(.*?)</span>',
re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'index': item[0],
'page_src': item[1],
'img_src': item[2],
'title': item[3],
'other_title': item[4],
'director': item[5],
'release_date': item[6],
'country': item[7],
'type': item[8],
'rate': item[9],
}
定義保存內容函數
#函數:將內容寫入文件
def write_to_file(content):
with open('douban_movie_rankings.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
定義主函數
#主空函數
def main():
#用於翻頁
for offset in range(10):
#獲取網址
url = f'//movie.douban.com/top250?start={offset * 25}&filter='
#獲取html文件
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)
定義魔法函數
if __name__ == '__main__':
main()
運行結果:
原創作者:孤飛-部落格園
原文鏈接://www.cnblogs.com/ranxi169/p/16564490.html