[爬虫基础]--抓取豆瓣top250电影, 简单易懂, 零基础入门

发布于:2024-08-13 ⋅ 阅读:(80) ⋅ 点赞:(0)

1. 抓取目标:

下载top250电影的图片, 并以电影名称作为文件名进行保存

 2. 获取网页源代码:

我们每天看到的浏览器页面, 本质上都是html代码和css代码, 向服务器发出请求后, 服务器会返回一连串的信息, 经过浏览器选然后, 就变成了我们每天看到的界面

可以在网页中通过鼠标右键查看网页的源代码

获得网页的源代码是爬虫的第一步, 这一步需要用到requests包, 这是爬虫中最常用到的包, 可以模拟浏览器向服务器发出请求, 从而得到网页的源代码

import requests

 requests.get(url, headers)

使用requests中的get函数, 传入网址就可以获得网页的源代码,  那么headers又是什么?

header是请求头, 现在很多网页都有防爬虫的机制, 如果直接申请, 服务器很有可能就会忽略掉, 是headers参数可以模拟用户使用浏览器发出申请, 从而正常获取到资源

如何获取到自己的headers?同样鼠标右键, 点击检查

  • 第一步, 点击网络
  • 第二步, 刷新浏览器
  • 第三步, 随机找到一个资源, 拖动找到User-Agent

 headers以字典的形式报存, key值为User-Agent, value值是后面一长串的信息

    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}

 在观察网页, 豆瓣电影以25个电影为一页, 一共250个, 不同的网页之间发现区别也就只要start后的数值不同, 使用for循环来访问不同网页

 

for i in range(0,250,25):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}
    data = requests.get(rf'https://movie.douban.com/top250?start={i}&filter=',headers=headers).content.decode('utf-8')

 get函数返回Respond对象, 我们只需要里面的content内容, 在经过解码就可以获得网页的源代码

使用print函数打印一些, 发现跟我们在浏览器看到的代码是一样的

3.筛选出图片信息

同样右键检查, 使用左上角的小工具, 点击图片, 可以找到这个图片的代码位置, 这个代码就包括了我们所有想要的信息: 电影名称, 图片资源位置 

我们是找到了, 但是如何用代码找到? 这就需要使用到正则表达式

 <img width="100" alt="怦然心动" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p501177648.webp" class="">

观察所有的图片代码, 都以<img开头, alt参数是电影名, src参数是图片资源在服务器中存放的位置

因此正则表达式可以像我一样这么写,

  • .*表示匹配任意字符 
  • ()内就是我们想要的
for i in range(0,250,25):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}
    data = requests.get(rf'https://movie.douban.com/top250?start={i}&filter=',headers=headers).content.decode('utf-8')

    data_list = data.split('\n')
    for line in data_list:

        result = re.match('.*<img width.*alt="(.*)" src="(.*)" class=.*>',line)
        if result:
            name = result.group(1)
            pic_url = result.group(2)
            print(name,pic_url)

最后使用print打印一下, 看下是否筛选正确

4.图片下载和保存

知道src, 我们自然可以从服务器中获取图片下载下来, 在当前目录下创建top250文件夹来保存图片, 添加延时让程序运行更加稳定, 运行程序就可以下载了

import requests
import re
import time

for i in range(0,250,25):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0'}
    data = requests.get(rf'https://movie.douban.com/top250?start={i}&filter=',headers=headers).content.decode('utf-8')

    data_list = data.split('\n')
    for line in data_list:

        result = re.match('.*<img width.*alt="(.*)" src="(.*)" class=.*>',line)
        if result:
            name = result.group(1)
            pic_url = result.group(2)
            print(name,pic_url)
            with open(rf'top250\{name}.jpg','wb') as f:
                picture = requests.get(pic_url,headers=headers)
                f.write(picture.content)
            time.sleep(1)