python 豆瓣电影top250_「豆瓣电影top250」豆瓣电影TOP250抓取 - seo实验室
豆瓣電影top250
全部代碼以及分析見GitHub:https://github.com/dta0502/douban-top250
本文是Python爬取豆瓣的top250電影的分析和實現(xiàn),具體是將電影的標題、電影描述、電影的評分、電影的評論數(shù)以及電影的一句影評抓取下來,然后輸出csv文件。
第一步:打開豆瓣電影top250這個頁面。
第二步:分析網(wǎng)頁源代碼,找到我們需要爬取的信息的標簽,例如電影title的標簽等等是什么。
第三步:寫代碼了,將整個html請求下來,然后解析網(wǎng)頁,獲取我們需要的信息,利用lxml進行解析。
網(wǎng)頁分析
首先打開豆瓣電影top250,我們可以看到電影是按照一個列表呈現(xiàn)出來的,頁面是通過最底部的12345…來進行翻頁查看的。
定位頁面元素
我通過chrome的開發(fā)者工具來分析頁面元素。下面是chrome的檢查的頁面:
點擊上圖中畫圓圈的圖標,然后自己鼠標在頁面上選中一部分,就會直接定位到具體的地方了。
電影信息的位置
通過上面所說的方法,我們可以觀察得到所有列表是放在一個class = ‘grid_view’的ol標簽中的,這個標簽下的每一個li標簽就是每一部電影信息的Item。
ol標簽的XPath路徑
//*[@id="content"]/p/p[1]/ol
電影標題的XPath路徑
//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[1]/a/span[1]
電影的描述
//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p[1]
電影評分的XPath路徑
//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p/span[2]
電影評論數(shù)的XPath路徑
//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p/span[4]
電影的一句經(jīng)典影評
//*[@id="content"]/p/p[1]/ol/li[1]/p/p[2]/p[2]/p[2]/span
翻頁
每一頁網(wǎng)址的變化規(guī)律,一頁可以顯示25部電影,就是說這250部電影一共有10頁。觀察前幾頁的網(wǎng)址很容易發(fā)現(xiàn)規(guī)律:就是start后面跟的參數(shù)變化,等于(頁數(shù)-1)*25,而且發(fā)現(xiàn)后面的filter去掉也不影響。
https://movie.douban.com/top250?start=0
https://movie.douban.com/top250?start=25
...
https://movie.douban.com/top250?start=225
現(xiàn)在完成了整個網(wǎng)頁的分析,下面開始實現(xiàn)爬取
Python實現(xiàn)爬取(baseline model)
導入第三方庫
requests模塊取代內(nèi)建的urllib2模塊,因為其速度更快而且可讀性更好。
lxml
lxml是一個優(yōu)美的擴展庫,用來快速解析XML以及HTML文檔即使所處理的標簽非常混亂。
import requests
from lxml import etree
import csv
requests獲取頁面
這里我們將使用 requests.get 來從頁面中取得我們的數(shù)據(jù), 通過使用 html 模塊解析它,并將結(jié)果保存到 tree 中。
headers={
'User-Agent':'Mozilla/5.0 (windows NT 6.1; WOW64) APPleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
data = requests.get(url,headers = headers).text
selector = etree.HTML(data)
etree現(xiàn)在包含了整個HTML文件到一個優(yōu)雅的樹結(jié)構(gòu)中,我們可以使用兩種方法訪問:
XPath:XPath是一種在結(jié)構(gòu)化文檔(如HTML或XML)中定位信息的方式。
CSS選擇器。
下面我采用XPath方法來定位信息。
電影信息的XPath路徑獲取
Chrome可以右鍵元素,選擇‘Inspect element’,高亮這段代碼,再次右擊,并選擇‘Copy XPath’。
下面是根據(jù)XPath路徑獲取想要的電影信息,把它們保存到變量中。
film=selector.xpath('//*[@id="content"]/p/p[1]/ol/li')
for p in film:
title = p.xpath('p/p[2]/p[1]/a/span[1]/text()')[0]
describe = p.xpath('p/p[2]/p[2]/p[1]/text()') #這里我爬取了年份、國家、類型這三個參數(shù),忽略了導演等參數(shù)
rating = p.xpath('p/p[2]/p[2]/p/span[2]/text()')[0]
comments_nums = p.xpath('p/p[2]/p[2]/p/span[4]/text()')[0]
comments = p.xpath('p/p[2]/p[2]/p[2]/span/text()')[0]
下面看下獲取到的電影信息:
>>> title
'怦然心動'
>>> describe[0]
'\n 導演: 羅伯·萊納 Rob Reiner\xa0\xa0\xa0主演: 瑪?shù)铝铡た_爾 Madeline Carroll / 卡...'
>>> describe[0].lstrip()
'導演: 羅伯·萊納 Rob Reiner\xa0\xa0\xa0主演: 瑪?shù)铝铡た_爾 Madeline Carroll / 卡...'
>>> describe[0].lstrip().split('\xa0\xa0\xa0')
['導演: 羅伯·萊納 Rob Reiner', '主演: 瑪?shù)铝铡た_爾 Madeline Carroll / 卡...']
>>> describe[1]
'\n 2010\xa0/\xa0美國\xa0/\xa0劇情 喜劇 愛情\n '
>>> describe[1].lstrip() #lstrip = left strip =去除(字符串)左邊的
'2010\xa0/\xa0美國\xa0/\xa0劇情 喜劇 愛情\n '
>>> describe[1].lstrip().rstrip() #rstrip = right strip =去除(字符串)右邊的
'2010\xa0/\xa0美國\xa0/\xa0劇情 喜劇 愛情'
>>> describe[1].lstrip().rstrip().split('\xa0/\xa0')
['2010', '美國', '劇情 喜劇 愛情']
>>> rating
'8.9'
>>> comments_nums
'691709人評價'
>>> comments_nums[:-3]
'691709'
>>> comments
'真正的幸福是來自內(nèi)心深處。'
完整實現(xiàn)
import requests
from lxml import etree
import csv
top250_url = 'https://movie.douban.com/top250?start={}&filter='
movie_name = '名稱'
movie_year = '年份'
movie_country = '國家'
movie_type = '類型'
movie_director = '導演'
movie_assess = '評價人數(shù)'
movie_score = '評分'
movie_num = 0
with open('top250_movie.csv','w',newline = '',encoding = 'utf-8') as f:
writer = csv.writer(f)
writer.writerow([movie_num,movie_name,movie_year,movie_country,movie_type,movie_director,movie_assess,movie_score])
for lists in range(10):
movie_content = requests.get(top250_url.format(lists*25)).text
selector = etree.HTML(movie_content)
all_list = selector.xpath('//*[@id="content"]/p/p[1]/ol/li')
for item in all_list:
movie_name = item.xpath('p/p[2]/p[1]/a/span[1]/text()')[0]
movie_assess = item.xpath('p/p[2]/p[2]/p/span[4]/text()')[0][:-3]
movie_score = item.xpath('p/p[2]/p[2]/p/span[2]/text()')[0]
movie_num += 1
# 下面將電影的介紹信息進行整理
movie_intro = item.xpath('p/p[2]/p[2]/p[1]/text()')
movie_actor_infos = movie_intro[0].lstrip().split('\xa0\xa0\xa0')
movie_other_infos = movie_intro[1].lstrip().rstrip().split('\xa0/\xa0')
# 下面是導演信息
movie_director = movie_actor_infos[0][3:]
# 下面是電影上映的年份
movie_year = movie_other_infos[0]
# 下面是電影的國家
movie_country = movie_other_infos[1]
# 下面是電影的類型
movie_type = movie_other_infos[2]
writer.writerow([movie_num,movie_name,movie_year,movie_country,movie_type,movie_director,movie_assess,movie_score])
結(jié)果
import pandas as pd
import csv
df = pd.read_csv("top250_movie.csv",encoding = 'utf-8')
df
>>> df.info()
RangeIndex: 250 entries, 0 to 249
Data columns (total 8 columns):
0 250 non-null int64
名稱 250 non-null object
年份 250 non-null object
國家 250 non-null object
類型 250 non-null object
導演 250 non-null object
評價人數(shù) 250 non-null int64
評分 250 non-null float64
dtypes: float64(1), int64(2), object(5)
memory usage: 15.7+ KB
遇到的問題
csv文件產(chǎn)生空行的問題
excel打開csv出現(xiàn)亂碼怎么解決
參考
使用python抓取豆瓣top250電影數(shù)據(jù)進行分析
python爬蟲一:抓取豆瓣電影Top250
全部代碼以及分析見GitHub:https://github.com/dta0502/douban-top250
相關(guān)閱讀
《社交網(wǎng)絡(luò)》是一部改編自本·麥茲里奇的小說《意外的億萬富翁:Facebook的創(chuàng)立,一個關(guān)于性、金錢、天才和背叛的故事》,由大衛(wèi) · 芬
一直在忙項目,終于有時間重新來總結(jié)下css。
一組嵌套的盒子,子盒子和父盒子之間想設(shè)置上邊距,不能用margin-top設(shè)置。因為子盒子
博客呃,其實我是個菜如一只雞的家伙了,想了那么久說要去打Topcoder 的srm,從配置好到實際打,中間間隔估計超過1個月.當然第一次srm人
事實上stoppropagation和cancelBubble的作用是一樣的,都是用來阻止瀏覽器默認的事件冒泡行為。不同之處在于stoppropagation屬于W3
雯雅婷4 PoorSakura vol.4
作品內(nèi)容 (RJ065602)【游戲名稱】:(過于H我就不說了,大家自己找一下)【サークル名 】:? 7thDream サ
總結(jié)
以上是生活随笔為你收集整理的python 豆瓣电影top250_「豆瓣电影top250」豆瓣电影TOP250抓取 - seo实验室的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows Server 2008操
- 下一篇: java同名变量在list中添加两次_快