爬取初試----貓眼電影,貓眼評分

之前看了很多關於爬蟲的文章或教學視頻,私以爲這個教程最清晰,也是最有條理的
分享url :
作者:python爬蟲
https://www.bilibili.com/read/cv998287
出處: bilibili

爬蟲的主要思想是:請求網頁->獲取html源碼->匹配內容
多頁爬取:獲取頁碼->構建所有頁碼的循環,逐頁爬取
舉個例子:貓眼電影的評分網頁
https://maoyan.com/films?showType=3&offset=30 <—這個是第二頁的url,
https://maoyan.com/films?showType=3&offset=60<—這個是第三頁的url
不難發現,他們的網頁是有規律的,offset是遞增的,公差爲30
這將有利於我們構建頁碼的循環,實現多頁爬取

import requests
url = "https://maoyan.com/films?showType=3&offset="
for i in range(10):
    pn_url= url+str(i*30)#由於貓眼電影每一個網頁的offset的公差爲30
    pn_html =requests.get(pn_url).text
    print(pn_url)#打印網站地址

貓眼評分
關於獲取電影名字以及電影評分:
按下圖操作,然後右鍵選擇“copy xpath”
獲取頁碼的xpath

pn=data.xpath('//*[@id="app"]/div/div[2]/div[3]/ul/li[7]/a/text()')
#從html中獲取頁碼所對應的標籤+/text()來取出文本

獲取名字和評分
在dd文件夾下有三個div,分別是:電影信息,電影名字,電影評分
這是原作者的建議:分別獲取class屬性爲"channel-detail movie-item-title"的div標籤下的title值和div下的a標籤的href值(這裏沒有用複製xpath路徑,當然如果可以的話,也建議大家用這種方式,因爲用路徑的話,萬一網頁修改一下結構,那我們的代碼就要重新寫了)
pycharm解析html

names=pn_data.xpath('//div[@class="channel-detail movie-item-title"]/@title')
scores=pn_data.xpath('//div[@class="channel-detail channel-detail-orange"]')
 

由於評分不在一個標籤下,而是2個標籤下的文本內容合併的,所以用這種方式獲取!

 scores=pn_data.xpath('//div[@class="channel-detail channel-detail-orange"]')
 scores=[x.xpath('string(.)')for x in scores]

完整代碼如下:

import requests
from lxml import etree

url = "https://maoyan.com/films?showType=3&offset="
html = requests.get(url).text #.text是獲取html文本,如果不加,則返回是否獲取成功的提示
data=etree.HTML(html)#用lxml中的etree方法解析html,
print(html)#解析html的結果
pn=data.xpath('//*[@id="app"]/div/div[2]/div[3]/ul/li[7]/a/text()')
#從html中獲取頁碼所對應的標籤+/text()來取出文本
for i in range(10): #先獲取10頁做個實驗
    pn_url= url+str(i*30)#由於貓眼電影每一個網頁的offset的公差爲30
    pn_html =requests.get(pn_url).text
    print(pn_url)
    pn_data=etree.HTML(pn_html)
    names=pn_data.xpath('//div[@class="channel-detail movie-item-title"]/@title')
    #與獲取頁碼的方式相似,打開F12,我們所要的內容在dd這個標籤下,它有三個div,分別放着電影名,電影評分,電影簡介
    scores=pn_data.xpath('//div[@class="channel-detail channel-detail-orange"]')
    scores=[x.xpath('string(.)')for x in scores]
    for x,y in zip(names,scores):
        with open('movie.txt','a+',encoding='utf-8')as f:
            f.write('[電影名]'+x+' ')
            f.write('[電影評分]'+y+' '+'\n')
    print(f'the {i+1} page downloaded!')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章