Datawhale爬虫(第5期)入门第二练||豆瓣电影TOP250的内容

python正则表达式:

正则表达式是一个特殊的字符串序列,可以方便的检测字符串是否与某种模式匹配!
1. re.match() 函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,返回None

语法: re.match(pattern, string, falgs=0)
示例:

import re
print(re.match('www', 'www.xiaomi.com').span())   # 在起始位置匹配
print(re.match('com', 'www.xiaomi.com'))   # 不在起始位置匹配

执行结果

2. re.search() 函数
re.search 扫描整个字符串,并返回第一个成功匹配的值

语法re.search(pattern, string, falgs=0)
示例:

import re
print(re.match('www', 'www.xiaomi.com').span())   # 在起始位置匹配
print(re.match('com', 'www.xiaomi.com').span())   # 不在起始位置匹配

在这里插入图片描述

学习任务:结合requests、re两者的内容爬取豆瓣电影 Top 250里的内容:要求抓取名次、影片名称、国家、导演等字段。
思路分析:首先找到豆瓣top250的网址:https://movie.douban.com/top250
通过手动翻页浏览,发现如下规律:
https://movie.douban.com/top250?start=0&filter=         # 第一页内容
https://movie.douban.com/top250                         # 第一页这个也可以
https://movie.douban.com/top250?start=25&filter=        # 第二页内容
https://movie.douban.com/top250?start=50&filter=        # 第三页内容
https://movie.douban.com/top250?start=75&filter=        # 第四页内容
因此我们只需要更改 start= 后面的数字即可构造出10页的网址
因为我们 只要 名次、影片名称、国家、导演等字段,因为详细页的信息更丰富,本次爬虫在详细页中进行,因此先需要爬取进入详细页的网址链接,进而爬取数据

在这里插入图片描述

爬虫代码如下:
import requests
from lxml import etree
import re
import time

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/71.0.3578.98 Safari/537.36'    # 加入请求头
}


def get_movie_url(url):
    """
    获取详细页URL的函数
    :param url:
    :return:
    """
    html = requests.get(url, headers=headers)
    selector = etree.HTML(html.text)
    movie_hrefs = selector.xpath('//div[@class="hd"]/a/@href')
    for movie_href in movie_hrefs:
        get_movie_info(movie_href)


def get_movie_info(url):
    """
    获取详细页信息的函数
    :param url:
    :return:
    """
    html = requests.get(url, headers=headers)
    selector = etree.HTML(html.text)
    try:
        ranking = selector.xpath('//*[@id="content"]/div[1]/span[1]/text()')[0]  # 排名
        name = selector.xpath('//*[@id="content"]/h1/span[1]/text()')[0]   # 电影名称
        country = re.findall('<span class="pl">制片国家/地区:</span>(.*?)<br/>', html.text, re.S)[0]  # 国家
        actor = selector.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]  # 导演
        print(ranking + '    ' + name + '    ' + country + '    ' + '    ' + actor)
    except IndexError:
        pass


if __name__ == '__main__':
    urls = ['https://movie.douban.com/top250?start=%s&filter=' % i for i in range(0, 250, 25)]
    for url in urls:
        get_movie_url(url)
        time.sleep(3)
抓取到的数据在控制台打印出来的结果:
一共250条数据

在这里插入图片描述

第二天的学习任务就到这里了,记录每一天认真的自己,坚持输出,共勉!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值