豆瓣热门电视剧爬取(电影类似)
一、url地址
利用chrome打开豆瓣,电视剧下刷新,打开开发者模式的nettwork,可以看到如下图,本页所有的数据都在这个请求响应下,,打开response,看到它的url地址是
https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
经过翻页看到每一页20条数据,下一页的地址和上一页url地址最后一位数字不同,因此规律就找到了。
二、代码
import requests
from headers import agent
import json
from lxml import etree,html
import re
class DouBan:
def __init__(self):
self.url="https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start="
def get_Json(self,url):#发送请求,这里的headers是我自己封装的的随机的headers,需要你自己更换
return(requests.get(url,headers=agent()).content.decode())
def dealUrl(self,html):
data=json.loads(html)
for i in data.values():
url=[ j.pop("url") for j in i]
return url
def get_Movie_Data(self,movie_url):
return(requests.get(movie_url,headers=agent()).content.decode())
def moviedata_draw(self,movie_data,movie_url):
data={}
content=etree.HTML(movie_data)
title=content.xpath("//body//h1//span[1]/text()")
score=content.xpath("//strong[@class='ll rating_num']/text()")
director=content.xpath("//body/div[@id='wrapper']/div[@id='content']/div/div/div/div/div/div[@id='info']/span[2]/span[2]/a/text()")
actions=content.xpath('//span[@class="actor"]//a/text()')
Movie_type=content.xpath("//body/div[@id='wrapper']/div[@id='content']/div/div/div/div/div/div[@id='info']/span[@property='v:genre']/text()")[0]
#country=content.xpath("//span[contains(text(),'2020-05-04(')]/text()")[0]
data=data={"电影名":title,
"评分":score,
"地址":movie_url,
"导演":director,
"演员":actions,
"电影类型":Movie_type
}
with open ("豆瓣电影.txt","a+",encoding="utf-8") as f:
f.write(str(data)+"\n")
def next_pageurl(self):#这里我们先预设有两千条数据
return [self.url+str(i*20) for i in range(100)]
def run(self):
url_list=self.next_pageurl()
for url in url_list:
print(url)
#1、发送请求获取JSON页面信息
html=self.get_Json(url)
print(html)
#2、每一页的页面url提取
movie_url=self.dealUrl(html)
print(movie_url)
for url in movie_url:
movie_data=self.get_Movie_Data(url)
self.moviedata_draw(movie_data,url)
if __name__=="__main__":
douban=DouBan()
douban.run()
三、结果
数据比较多,因此中途终止了程序的执行。
四、不足
问题:结束判断没有添加
解决:如果我们提取的页面数据,url列表长度小于20,就说明达到了最后一页。因此可以添加一个if判断语句。