💯 博客内容:【LeetCode训练营】用栈来实现队列+用队列来实现栈 详解
😀 作 者:陈大大陈
🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信!
💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘
目录
获取豆瓣网页源码
怎么伪装成浏览器请求
怎么打印标题
最终代码
后记
首先要安装bs4这个第三方库。
打开pycharm的终端界面,输入pip install bs4即可安装。
我之前安装过,所以显示已安装。
第三步是导入requests库,没有的话也要安装,步骤和上面的一样,命令变为pip install requests
获取豆瓣网页源码
先获取网页源码,需要我们先导入requests库。
先试试直接获取,看能不能成功。
import requests
response=requests.get("https://movie.douban.com/top250")
print(response)
print(response.status_code)
结果如下。
打印出错误码,访问失败。
这是因为豆瓣网页识别出了我们的程序,而豆瓣网页只想服务于真正的用户。
那么我们接下来要做的就是将程序伪装成浏览器请求来伪装成用户。
怎么伪装成浏览器请求
首先随便打开一个网页。
右键点击检查。
找到网络选项,点击跳转到下面的页面。
接着刷新页面,页面变成下面这样。
随便点开一个,找到User-Agent选项。
复制它之后的内容。
我们创建一个叫headers的字典,它里面的键值对就是我们要传入的内容。
将代码升级为下面这样。
import requests
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42"
}
reponse=requests.get("https://movie.douban.com/top250",headers=headers)
print(reponse)
print(reponse.status_code)
print(reponse.text)
运行。
没有报错,访问成功。接下来打印源码。
print(response.text)
打印成功。
怎么打印标题
第二步就是从bs4中导入BeautifulSoup库
from bs4 import BeautifulSoup
将响应体里面的内容用一个html变量储存。
html=response.text
接下来把html传入 BeautifulSoup的构造函数来获取想要的信息。
第二个参数传入html.parser,它的含义是html解析器,代表正在解析html内容。
使用一个变量储存它。
接下来我们需要知道所查找信息的特点。
打开豆瓣网页,右键检查,选择小箭头,鼠标靠近电影名称。
我们发现标题都是span元素,且class属性都是title。
这样我们就可以使用BeautifulSoup的findAll方法,第一个标签传入标签名span,第二个标签传入class值。
all_titles=soup.findAll("span",attrs={"class":"title"})
findAll返回的是一个可迭代对象,我们来迭代一下它,打印出来如下所示。
我们不想要它的HTML标签,所以就只打印它的string属性。
print(title_string)
这次打印出来如下所示,我们也不想要它的原版标题,该怎么删除呢?
一个简单的if判断就能搞定。
title_string=title.string
if '/' not in title_string:
print(title.string)
这样,top25的电影就被我们打印出来了。
可我们想要的是top250。
继续找规律。
这是第一页的网址。
这是第二页的地址。
我们发现第一页和第二页的区别只在于start的值。
那我们就可以通过修改start的值加上for循环来达到目的。
最终代码
from bs4 import BeautifulSoup
import requests
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.42"}
for num in range(0,250,25):
response=requests.get(f"https://movie.douban.com/top250?start={num}",headers=headers)
# print(response)
# print(response.status_code)
html=response.text
soup=BeautifulSoup(html,"html.parser")
all_titles=soup.findAll("span",attrs={"class":"title"})
for title in all_titles:
title_string=title.string
if '/' not in title_string:
print(title_string)
爬虫虽好,不要贪杯哦,不然。。。
后记
这篇文章是看这个视频做的笔记。【10-实战课】从源码获取豆瓣电影TOP250_哔哩哔哩_bilibili
这个up主讲的巨好,建议大家都看看。