No.1 豆瓣电影Top250榜单

豆瓣电影Top250榜单

一、简介

网址:https://movie.douban.com/top250

效果:下载Top250的电影封面

使用框架:requests、re

难度系数:

二、教程

1. 确定爬虫思路

首先我们在浏览器打开网站,按 Ctrl+U 查看网页源代码,我们可以在网页源代码中发现所有的电影名字和封面的图片地址,说明该网站采取的是静态网页的方式:
在这里插入图片描述

静态网页就是把所有的信息全部都防在网页源代码中,我们要取信息,只需要把网页源代码下载下来就行。
有了网页源代码我们就已经拿到了所有信息,剩下的工作就是从网页源代码中提取信息罢了。
因此相对来说, 这种静态网页的网站都是属于那种比较容易爬取的网站
向下浏览网页,我们发现这里不同的页码。总记录为250条,因此我们可以确定页码是分散在了这10张页面里的。

在这里插入图片描述
在这里插入图片描述

点击第2页和第3页,我们可以发现上面的网址中的数字和下面的页码的关系为:网址 = 25 * 页码

经过对网页代码的简单分析,我们就可以确定我们的爬虫思路了:

获取网页源代码
提取信息
下载图片
构造网址参数
2. 构造爬虫

本次爬虫我们采用最为经典的爬虫库—— requests进行爬取,这是一个第三方库,没有安装的需要通过 pip 进行安装:

pip install requests

安装完成后我们就可以开始进行我们的爬虫之旅了!

首先尝试下载网页源代码:

import requests

url = "https://movie.douban.com/top250?start=0&filter="
response = requests.get(url)  # 请求网站
print(response)  # 打印响应状态

执行完上面的结果后,我们得到的结果却是这个玩意儿:

<Response [418]>

去查HTTP状态码,结果发现没有对上号啊,以4开头的状态码只有417,哪里来的418???

赶紧去搜索一下,发现了状态码418的定义:

HTTP状态码418是IETF在1998年愚人节发布的一个玩笑RFC,在RFC 2324超文本咖啡壶控制协议中定义的,并不需要在真实的HTTP服务器中定义。当一个控制茶壶的HTCPCP收到BREW或POST指令要求其煮咖啡时应当回传此错误。它的含义是当客户端给一个茶壶发送泡咖啡的请求时,那就就返回一个错误的状态码表示:I’m a teapot,即:“我是一个茶壶”。这个HTTP状态码在某些网站中用作彩蛋,另外也用于一些爬虫警告。

原来我们是被别人发现了我们是一只小爬虫了。。。

尴尬

别慌,在做爬虫这条道路上,反爬虫和爬虫本身就是一直在做斗争的。胜败乃兵家常事,不要会心丧气!

网站是如何检测到我们是爬虫的呢?

每一个向网站的请求,我们都会带上一个Headers(了解更多请点击传送门),这个Headers就是网站来分辨用户的依据。

在这里面有一项参数,叫做 **User-Agent **

这个参数会告诉网站,请求它的浏览器的信息,当我们用上面的程序请求网站时,我们发送的 User-Agent 是长这个模样的:python-requests/2.23.0

再点击传送门,看看我们用正常浏览器请求时我们的 User-Agent 是长啥模样的,我用谷歌请求的是长这样的:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.14 Safari/537.36

好家伙,差异这么大,一眼就把我们识破了。。。

不要灰心,既然它可以让正常的浏览器访问,那我们把自己也伪装成正常的浏览器吧!

import requests

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

url = "https://movie.douban.com/top250?start=0&filter="
response = requests.get(url, headers=headers)
print(response)
print(response.test)

我们改良后的代码长这样,再去请求网站,得到的结果是下面这样的:

<Response [200]>
......
<img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class="">
......

激动人心的时候到了,我们成功拿到了网页源代码!!!

下一步,我们就需要从网页源代码中提取信息了,在这里我选择的是使用正则表达式来提取信息,还不会正则的小伙伴赶快点击传送门去学习学习吧!

import re

name_url = re.findall('<img width="100" alt="(.*?)" src="(.*?)" class="">', response.text)
for name, purl in name_url:
    print(f"name:{name}\turl:{purl}")

运行结果:

name:肖申克的救赎	url:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg
name:霸王别姬	url:https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg
......

既然我们已经拿到了图片的名字和url,那我们就可以尽情下载图片了!

with open(f"{name}.jpg", "wb") as f:
    content = requests.get(url, headers=headers).content
    f.write(content)
    print(f"{name}.jpg 下载完成!")

运行结果:

肖申克的救赎.jpg 下载完成!
霸王别姬.jpg 下载完成!

至此,我们的这只小爬虫就已经完成了!大家快去试试吧~

3. 效果图

在这里插入图片描述

4. 完整代码

如果觉得有帮助,请为博主点一个小小的 star ✩吧,你的鼓励是博主最大的动力!在这里插入图片描述

GitHub传送门

猜你喜欢

转载自blog.csdn.net/qq_43580193/article/details/107571385