首先请求豆瓣电影top250的网页内容:https://movie.douban.com/top250。
import requests
url = "https://movie.douban.com/top250"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
res = requests.get(url=url, headers=headers) # 请求
text = res.text # 获取请求的内容
解析可以通过:正则表达式、xpath、cssselect、beautifulsoup等。
这里我们获取每个电影的电影名称。我们使用xpath来进行解析。
打开网页,然后按F12,可以看到控制台
点击左上角的箭头,再获取你想要爬取的内容,就可以在控制台找到它对应的html。通过的路径来解析你想要的内容。
这里可以看出是//span[@class="title"]
。(@代表属性,可以获取class、id的属性)。
不确定的话可以在console中检验,输入$x('//span[@class="title"]')
。就可以看到最终解析的结果。
e = etree.HTML(text=text) # 将请求内容转为html
title = e.xpath('//span[@class="title"]')
for i in title:
print(i.text)
分析网页可以看出他一页有25个电影,一共10页。要获取250个电影就必须请求所有页。
获取下一页内容:
获取链接再请求之后在请求评论时使用,这里采用第二种方式。
第二页的链接:https://movie.douban.com/top250?start=25&filter=
第三页的链接:https://movie.douban.com/top250?start=50&filter=
…
这样可以找到规律,每页+50。
这里就用循环请求每一页的内容:
import requests
from lxml import etree
import time
for I in range(0, 250, 25):
url = "https://movie.douban.com/top250"+"?start="+str(I)+"&filter="
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
res = requests.get(url=url, headers=headers) # 请求
text = res.text # 获取请求的内容
e = etree.HTML(text=text) # 将请求内容转为html
title = e.xpath('//span[@class="title"]')
for i in title:
print(i.text)
time.sleep(1)
为了避免频繁请求,被封ip,所以每次请求都等待1s。
点击电影名称,则进入链接获取电影详情。所以可以解析电影的链接,再次请求。
import requests
from lxml import etree
import time
level = 0
for I in range(0, 250, 25):
url = "https://movie.douban.com/top250"+"?start="+str(I)+"&filter="
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'
}
res = requests.get(url=url, headers=headers) # 请求
text = res.text # 获取请求的内容
e = etree.HTML(text=text) # 将请求内容转为html
textHtml = e.xpath("//div[@class='hd']/a/@href") # 使用xpath解析获取每一个的影片详情的链接
for J in textHtml:
level += 1
print('——————————————————————————————————————————————————————————————————————————————————————————')
res1 = requests.get(url=J, headers=headers) # 请求每一个影片的详情
text1 = res1.text # 获取内容
e1 = etree.HTML(text=text1) # 转为html文本
filmName = e1.xpath('//h1/span[@property="v:itemreviewed"]') # 解析电影名称
print(str(level)+'. 电影名称:'+filmName[0].text)
score = e1.xpath('//div[@class="rating_self clearfix"]/strong') # 解析评分
print('评分为:'+score[0].text)
textHtml1 = e1.xpath('//p[@class=" comment-content"]/span') # 解析评论
print('评论为:')
for K in textHtml1:
print(K.text)
time.sleep(1)
time.sleep(3)