日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬取豆瓣电影TOP100

發布時間:2024/8/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬取豆瓣电影TOP100 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

爬蟲

首先我們在網站中打開我們要爬的網站
“http://maoyan.com/board/4”
這就是豆瓣高分電影前100的榜單.

然后我們點擊f12,再刷新一次,就可以看到網頁的基本信息了。
這時候我們來看一下第一部‘我不是藥神中的代碼信息。’

一個dd節點為一個電影的全部信息。
我們用正則表達式的方法去分析上面的代碼,首先是class為board-index的排名信息。
我們用正則表達式應該是這么去寫

<dd>.*?board-index.*?>(.*?)</i>

那我們接著分析第二部分的圖片,我們看圖片的節點一共有兩點:兩個img節點。
我們發現第二個img節點屬性為data-src為圖片鏈接,所以我們就分析這部分。
我們用正則表達式應該是這么去寫

.*?data.src="(.*?)"

以此類推我們接著分析剩下所有的信息。
第三部分為電影名,電影名在p節點的class=name下面。
我們用正則表達式應該這么寫

.*?name".*?a.*?>(.*?)</a>

那么接下來我們就寫一個完整的信息:分別記錄了排名,照片,名字,演員,時間,評分。

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star".*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

那我們就可以正式一步一步去做一份爬取任務了:
1.導入庫:

import json import requests from requests.exceptions import RequestException import re import time #time庫是用來延時訪問,某些網站設置了反爬,不能快速連續訪問該網站

2.抓取首頁:

def get_one_page(url):try:headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return None

3.正則提取:

def parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)items = re.findall(pattern, html)for item in items:yield {'index': item[0],'image': item[1],'title': item[2],'actor': item[3].strip()[3:],'time': item[4].strip()[5:],'score': item[5] + item[6]}

4.寫入文件:

def write_to_file(content):with open('result.txt', 'a', encoding='utf-8') as f:f.write(json.dumps(content, ensure_ascii=False) + '\n')

5.分頁爬取:

我們可以看到,一頁有10個電影。那我們爬取TOP100,則需要看10頁的電影內容。

當我們切到下一頁的時候,我們發現網站名稱后多了offset=10.第三頁的時候則是offest=20.
那我們就明白了,我們可以根據offest來對TOP100進行分頁爬蟲。

def main(offset):url = 'http://maoyan.com/board/4?offset=' + str(offset)html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_file(item) if __name__ == '__main__':for i in range(10):main(offset=i * 10)time.sleep(1) #貓眼多了反爬蟲,所以我們要延時等待。

完整代碼:

import json import requests from requests.exceptions import RequestException import re import timedef get_one_page(url):try:headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textreturn Noneexcept RequestException:return Nonedef parse_one_page(html):pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)items = re.findall(pattern, html)for item in items:yield {'index': item[0],'image': item[1],'title': item[2],'actor': item[3].strip()[3:],'time': item[4].strip()[5:],'score': item[5] + item[6]}def write_to_file(content):with open('result.txt', 'a', encoding='utf-8') as f:f.write(json.dumps(content, ensure_ascii=False) + '\n')def main(offset):url = 'http://maoyan.com/board/4?offset=' + str(offset)html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_file(item)if __name__ == '__main__':for i in range(10):main(offset=i * 10)time.sleep(1)

如果爬取過程中發現只爬取到了前10或者前20的內容就停止了。
那我們回到TOP100的網頁,發現了他讓我們進行圖片的驗證(反爬蟲)
由于我們現在還沒學到解決這類問題的方法。
所以我們自己進入網頁驗證完之后,再運行一次就能成功了。

總結

以上是生活随笔為你收集整理的爬取豆瓣电影TOP100的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。