使用lxml爬取豆瓣电影排行榜

使用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,如下图。
获取Cookie方法截图有了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
  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值