python爬取豆瓣电影top250

爬虫的步骤

  1. 模拟浏览器请求内容
  2. 响应并解析内容
  3. 存储解析后的内容(本篇重点在爬取最终内容,不涉及存储)

请求

首先请求豆瓣电影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,可以看到控制台
python爬取豆瓣电影top250_第1张图片
点击左上角的箭头,再获取你想要爬取的内容,就可以在控制台找到它对应的html。通过的路径来解析你想要的内容。
这里可以看出是//span[@class="title"]。(@代表属性,可以获取class、id的属性)。
不确定的话可以在console中检验,输入$x('//span[@class="title"]')。就可以看到最终解析的结果。
python爬取豆瓣电影top250_第2张图片

e = etree.HTML(text=text)    # 将请求内容转为html
title = e.xpath('//span[@class="title"]')
for i in title:
    print(i.text)

上结果图:
python爬取豆瓣电影top250_第3张图片

分页爬取

分析网页可以看出他一页有25个电影,一共10页。要获取250个电影就必须请求所有页。
获取下一页内容:

  1. 可以先爬取下面页码的链接,然后接着请求。
  2. 因为分页网页的url一般都有规律,可以通过寻找规律直接拼接出每一页的url。

获取链接再请求之后在请求评论时使用,这里采用第二种方式。
第二页的链接: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)


上结果图:
python爬取豆瓣电影top250_第4张图片

你可能感兴趣的:(爬虫,python,xpath)