摘要:行代碼實(shí)現(xiàn)爬取豆瓣電影排行榜代碼基于,用到的類庫(kù)有標(biāo)題文字通過(guò)偽造請(qǐng)求頭或設(shè)置代理等方式獲取頁(yè)面內(nèi)容,參考文檔對(duì)頁(yè)面進(jìn)行解析,提取數(shù)據(jù),參考文檔版本中用于操作數(shù)據(jù)庫(kù),中則使用,安裝用到的幾個(gè)類庫(kù)分析豆瓣電影頁(yè)面頁(yè)面分析爬取數(shù)據(jù)之前,我們都需
48行代碼實(shí)現(xiàn)Python3爬取豆瓣電影排行榜
代碼基于python3,用到的類庫(kù)有:
requests:通過(guò)偽造請(qǐng)求頭或設(shè)置代理等方式獲取頁(yè)面內(nèi)容,參考文檔
BeautifulSoup:對(duì)頁(yè)面進(jìn)行解析,提取數(shù)據(jù),參考文檔
PyMySQL:python3版本中用于操作MySQL數(shù)據(jù)庫(kù),python2中則使用mysqldb,Github
pip安裝用到的幾個(gè)類庫(kù):
pip install requests
pip install bs4
pip install pymysql
分析豆瓣電影頁(yè)面
頁(yè)面分析:
爬取數(shù)據(jù)之前,我們都需要對(duì)頁(yè)面進(jìn)行分析,看我們可以從中提取到哪些數(shù)據(jù),從下圖我們看到豆瓣電影top250的頁(yè)面結(jié)構(gòu),我們可以從中提取出排行榜(rank)、電影名字(name)、電影詳情頁(yè)鏈接(link)、電影海報(bào)(poster)、電影評(píng)分(score)、電影評(píng)論(quote)等,我在圖中進(jìn)行了標(biāo)注
URL分析:
通過(guò)點(diǎn)擊分頁(yè)我們可以發(fā)現(xiàn)URL的格式為:https://movie.douban.com/top2...
其中num表示25的倍數(shù)的數(shù)字,最小是0也就是第一頁(yè),最大為225也就是最后一頁(yè),這可以作為我們爬取頁(yè)面的限制條件,filter為過(guò)濾條件這里可不用管
代碼
引入類庫(kù):
import pymysql
import requests
from bs4 import BeautifulSoup
定義爬取鏈接,%d用作數(shù)字占位:
baseUrl = "https://movie.douban.com/top250?start=%d&filter="
定義爬取數(shù)據(jù)方法:
def get_movies(start):
url = baseUrl % start # 拼接爬取鏈接 lists = [] # 存儲(chǔ)此頁(yè)面的電影數(shù)據(jù) html = requests.get(url) # requests請(qǐng)求頁(yè)面內(nèi)容,由于豆瓣沒(méi)有限制爬取,所以不用設(shè)置偽請(qǐng)求頭 soup = BeautifulSoup(html.content, "html.parser") # BeautifulSoup解析頁(yè)面內(nèi)容 items = soup.find("ol", "grid_view").find_all("li") # 獲取所有的電影內(nèi)容 for i in items: movie = {} # 臨時(shí)存取電影的數(shù)據(jù) movie["rank"] = i.find("em").text # 電影排行榜 movie["link"] = i.find("div","pic").find("a").get("href") # 電影詳情頁(yè)鏈接 movie["poster"] = i.find("div","pic").find("a").find("img").get("src") # 電影海報(bào)地址 movie["name"] = i.find("span", "title").text # 電影名字 movie["score"] = i.find("span", "rating_num").text # 電影評(píng)分 movie["quote"] = i.find("span", "inq").text if(i.find("span", "inq")) else "" # 某些電影沒(méi)有點(diǎn)評(píng),沒(méi)有就設(shè)為空 lists.append(movie) # 保存到返回?cái)?shù)組中 return lists
連接數(shù)據(jù)庫(kù)并創(chuàng)建數(shù)據(jù)表:
連接數(shù)據(jù)庫(kù),需指定charset否則可能會(huì)報(bào)錯(cuò)db = pymysql.connect(host="localhost",user="root",password="root",db="test",charset="utf8mb4")
cursor = db.cursor() # 創(chuàng)建一個(gè)游標(biāo)對(duì)象
cursor.execute("DROP TABLE IF EXISTS movies") # 如果表存在則刪除
createTab = """CREATE TABLE movies(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, rank VARCHAR(4) NOT NULL, link VARCHAR(50) NOT NULL, poster VARCHAR(100) NOT NULL, score VARCHAR(4) NOT NULL, quote VARCHAR(50)
)"""
cursor.execute(createTab) # 執(zhí)行創(chuàng)建數(shù)據(jù)表操作
......
db.close() # 關(guān)閉數(shù)據(jù)庫(kù)
將提取到的數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)表中:
lists = get_movies(start) # 獲取提取到數(shù)據(jù)
for i in lists: # 插入數(shù)據(jù)到數(shù)據(jù)庫(kù)sql語(yǔ)句,%s用作字符串占位 sql = "INSERT INTO `movies`(`name`,`rank`,`link`,`poster`,`score`,`quote`) VALUES(%s,%s,%s,%s,%s,%s)" try: cursor.execute(sql, (i["name"], i["rank"], i["link"], i["poster"], i["score"], i["quote"])) db.commit() print(i[0]+" is success") except: db.rollback() start += 25
完整代碼:
import pymysql
import requests
from bs4 import BeautifulSoup
baseUrl = "https://movie.douban.com/top250?start=%d&filter="
def get_movies(start):
url = baseUrl % start lists = [] html = requests.get(url) soup = BeautifulSoup(html.content, "html.parser") items = soup.find("ol", "grid_view").find_all("li") for i in items: movie = {} movie["rank"] = i.find("em").text movie["link"] = i.find("div","pic").find("a").get("href") movie["poster"] = i.find("div","pic").find("a").find("img").get("src") movie["name"] = i.find("span", "title").text movie["score"] = i.find("span", "rating_num").text movie["quote"] = i.find("span", "inq").text if(i.find("span", "inq")) else "" lists.append(movie) return lists
if name == "__main__":
db = pymysql.connect(host="localhost",user="root",password="root",db="test",charset="utf8mb4")
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43503.html
摘要:注意爬豆爬一定要加入選項(xiàng),因?yàn)橹灰馕龅骄W(wǎng)站的有,就會(huì)自動(dòng)進(jìn)行過(guò)濾處理,把處理結(jié)果分配到相應(yīng)的類別,但偏偏豆瓣里面的為空不需要分配,所以一定要關(guān)掉這個(gè)選項(xiàng)。 本課只針對(duì)python3環(huán)境下的Scrapy版本(即scrapy1.3+) 選取什么網(wǎng)站來(lái)爬取呢? 對(duì)于歪果人,上手練scrapy爬蟲的網(wǎng)站一般是官方練手網(wǎng)站 http://quotes.toscrape.com 我們中國(guó)人,當(dāng)然...
摘要:標(biāo)簽空格分隔爬蟲一爬取網(wǎng)頁(yè),獲取需要內(nèi)容我們今天要爬取的是豆瓣電影頁(yè)面如下所示我們需要的是里面的電影分類,通過(guò)查看源代碼觀察可以分析出我們需要的東西。 標(biāo)簽(空格分隔):python爬蟲 一、爬取網(wǎng)頁(yè),獲取需要內(nèi)容 我們今天要爬取的是豆瓣電影top250頁(yè)面如下所示:showImg(https://segmentfault.com/img/remote/1460000006877726...
摘要:在這之前,還是有必要對(duì)一些概念超輕量級(jí)反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標(biāo)配系統(tǒng)。 爬蟲修煉之道——從網(wǎng)頁(yè)中提取結(jié)構(gòu)化數(shù)據(jù)并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關(guān)注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個(gè)爬取多頁(yè)面的網(wǎng)絡(luò)爬蟲主要講解了如何使用python編寫一個(gè)可以下載多頁(yè)面的爬蟲,如何將相對(duì)URL轉(zhuǎn)為絕對(duì)URL,如何限速,...
摘要:查看源碼下載頁(yè)面并處理提取數(shù)據(jù)觀察該網(wǎng)站結(jié)構(gòu)可知該頁(yè)面下所有電影包含在標(biāo)簽下。使用語(yǔ)句獲取該標(biāo)簽在標(biāo)簽中遍歷每個(gè)標(biāo)簽獲取單個(gè)電影的信息。以電影名字為例清洗數(shù)據(jù)其余部分詳見(jiàn)源碼頁(yè)面跳轉(zhuǎn)檢查后頁(yè)標(biāo)簽。 查看源碼 1 下載頁(yè)面并處理 DOWNLOAD_URL = http://movie.douban.com/top250/ html = requests.get(url).text tr...
閱讀 3574·2023-04-26 00:05
閱讀 963·2021-11-11 16:55
閱讀 3541·2021-09-26 09:46
閱讀 3528·2019-08-30 15:56
閱讀 920·2019-08-30 15:55
閱讀 2947·2019-08-30 15:53
閱讀 1960·2019-08-29 17:11
閱讀 826·2019-08-29 16:52