爬虫-Task01

爬虫-Task01:request.get进阶:爬取豆瓣电影

以完成爬取豆瓣电影为例,进行本次学习任务的总结。

目标是爬取豆瓣电影TOP250的影片名称和海报。
https://movie.douban.com/top250

首先对网页内容进行分析。
在这里插入图片描述
总共250部电影,每页25部,共有10页。因此,除了爬取每页的所需内容,还需要进行跳页操作。这里先手动进行翻页,通过观察发现网址发生了变化。
在这里插入图片描述
简单推理并尝试之后可以知道,这10页的网址可以通过如下规律迭代获得:

for offset in range(0, 250, 25):
    url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
    print(url)

在这里插入图片描述
那么,现在只需要解决每一页的内容爬取,再套上一层循环即可。
以爬取第一页的内容为例。

url = 'https://movie.douban.com/top250?start=0&filter='
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
print(text)

在这里插入图片描述
即可获得该页的所有内容。
再分析其中的具体内容,可以发现,在‘alt’之后,存在影片名称和海报地址。
在这里插入图片描述
那么,如下操作可以获得以“肖申克的救赎”为开头的text:

text = text[text.find('alt')+3:]
text.split('"')

在这里插入图片描述
接着,可以提取出影片“肖申克的救赎”的名称和图片地址:

text = text.split('"')
name = text[1]
image = text[3]
print(name)
print(image)

在这里插入图片描述
为了方便调用,将上述名称和地址的提取方法定义成单独的函数,并对一页中的25部影片逐部操作:

def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

url = 'https://movie.douban.com/top250?start=0&filter='
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
res = requests.get(url, headers=headers)
text = res.text
item = []
for i in range(25):
    text = text[text.find('alt')+3:]
    name,image = extract(text)
    item.append((name,image))
print(item)

在这里插入图片描述
这样便得到了第一页中25部影片的名称和图片地址。
接着,再套上一层循环,便可以得到10页共250部影片的名称和图片地址。

import requests

def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

for offset in range(0, 250, 25):
    url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        name,image = extract(text)
        item.append((name,image))
    for item1 in item:
        print(item1)

在这里插入图片描述
接着,再将item中的内容写入txt文档并保存海报图片。

import requests

def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

stars = 1

for offset in range(0, 250, 25):
    url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        name,image = extract(text)
        item.append((name,image))
    for item1 in item:
        with open('douban_film.txt','a',encoding='utf-8') as f:
            f.write('排名:%d\t电影名:%s\n' % (stars, item1[0]))
        r = requests.get(item1[1])
        with open('image/' + str(item1[0]) + '.jpg', 'wb') as f:
            f.write(r.content)
        stars += 1

最后,可以将生成item模块和写入模块写成单独的函数。

import requests

def write_file(item, stars):
    '''根据提取出的影片名称和图片地址写入txt文档并保存图片'''
    print(item)
    with open('douban_film.txt','a',encoding='utf-8') as f:
        f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
    r = requests.get(item[1])
    with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
        f.write(r.content)

def extract_html(url):
    '''根据url提取影片名称和图片地址'''
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        item.append(extract(text))
    return item

def extract(text):
    '''根据文档提取影片名称和图片地址'''
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image

def main():
    stars = 1
    for offset in range(0, 250, 25):
        url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
        for item in extract_html(url):
            write_file(item, stars)
            stars += 1

if __name__ == '__main__':
    main()

到此,豆瓣电影TOP250的爬虫小任务圆满完结,撒花~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值