使用Python爬虫爬取豆瓣电影排行榜
1.信息分析
需要获取的信息有:电影名、评分、导演、编剧、演员、日期、评论数、类型、详情页链接等。
需要爬取的网站地址:豆瓣电影排行榜
页面截图如下
从上面的图片可以看出,只是在首页并不能获得所有需要的信息,并且信息并不是完整的还有遗漏。
所以获得信息时需要进入每个电影所在的也就是详情页页面。如下图
2.解析方法
lxml方法
首先如果想要对网页进行解析,那么加一个请求头必不可少,在插入请求头时,不仅要加入我们熟悉的User-Agent,还要加一个Cookie,Cookie是用来存储网页中的账号密码信息,如果在headers中加入一个Cookie,如果不加Cookie,在爬几次过后很有可能会显示登陆跳转。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
'Cookie': ''
}
获取Cookie的方法也很简单,登录豆瓣后打开网站的检查功能,在Network中就可获得,方法类似于获得User-Agent,如下图。
有了headers以后就可以使用request方法与lxml方法来对网页进行解析,代码如下。
import requests
from lxml import etree
url = 'https://movie.douban.com/chart'
html = requests.get(url,headers=headers).text
data = etree.HTML(html)
此时,data中存储的信息就是已经解析过的信息了,可以直接使用lxml方法来解析,一般使用Xpath语句来进行查找所需要的信息。
前期工作已经完成,那么,我们现在开始解析所需要的信息,因为前面已经分析了,想要获得完整的信息,需要进入每个电影的详情页来进行爬取,所以我们需要在首页中得到所有电影的详情页链接,通过检查,可以获得电影的详情页链接,如下图
由上图可以得到详情页链接的Xpath语句为//div[@class=‘pl2’]/a/@href,代码如下:
urllist = data.xpath("//div[@class='pl2']/a/@href")
注意的是xpath方法返回的值为一个列表,无论查找符合条件的数据有多少,返回的都是一个列表。
此时的urllist存储的为首页所有电影的详情页链接。
此时如果想要获得更多的信息,就需要再对所获得的详情页链接进行以上相同的步骤,这里xpath语法的获取就不赘述了,代码如下:
html = requests.get(url,headers=headers).text
data = etree.HTML(html)
电影名 = data.xpath("//h1/span[1]/text()")[0]
导演 = data.xpath("//span[1]/span[@class='attrs']/a/text()")[0]
编剧 = data.xpath("//span[2]/span[@class='attrs']/a/text()")
主演 = data.xpath("//a[@rel='v:starring']/text()")
类型 = data.xpath("//span[@property='v:genre']/text()")
评分 = data.xpath("//strong[@property='v:average']/text()")[0]
评论数 = data.xpath("//span[@property='v:votes']/text()")[0]
item = {
'电影名':电影名,
'导演':导演,
'编剧':编剧,
'主演':主演,
'类型':类型,
'评分':评分,
'评论数':评论数,
'详情页链接':url,
}
需要注意的是,因为电影名导演等信息只有一个,且上面已经解释了xpath方法获得的信息是一个列表,所以就在xpath方法后加了[0],并将所有获得的信息存在item中。
所以,只需要遍历urllist就可以获得所有电影的信息,创建一个队列,将所有的信息存入itemQueue中。代码如下:
from queue import Queue
itemQueue = Queue()
for url in urllist:
解析网页数据代码块
itemQueue.put(item)
此时,所有所需的信息都存入了itemQueue队列中。
如果需要将所有信息输出则需要以下代码:
while True:
if itemQueue.empty()==False:
item = itemQueue.get()
print(item)
else:
break
运行结果如下(不完全):
3.源码
# encoding:utf-8
import time
from queue import Queue
import requests
from lxml import etree
url = 'https://movie.douban.com/chart'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
'Accept-Language':'zg-CN,zh;q=0.8',
'Cookie': ''}#Cookie需要自己使用自己的Cookie
html = requests.get(url,headers=headers).text
data = etree.HTML(html)
urllist = data.xpath("//div[@class='pl2']/a/@href")
itemQueue = Queue()
for url in urllist:
html = requests.get(url,headers=headers).text
data = etree.HTML(html)
电影名 = data.xpath("//h1/span[1]/text()")[0]
导演 = data.xpath("//span[1]/span[@class='attrs']/a/text()")[0]
编剧 = data.xpath("//span[2]/span[@class='attrs']/a/text()")
主演 = data.xpath("//a[@rel='v:starring']/text()")
类型 = data.xpath("//span[@property='v:genre']/text()")
评分 = data.xpath("//strong[@property='v:average']/text()")[0]
评论数 = data.xpath("//span[@property='v:votes']/text()")[0]
item = {
'电影名':电影名,
'导演':导演,
'编剧':编剧,
'主演':主演,
'类型':类型,
'评分':评分,
'评论数':评论数,
'详情页链接':url,
}
itemQueue.put(item)
time.sleep(2)
while True:
if itemQueue.empty()==False:
item = itemQueue.get()
print(item)
else:
break