Python作为这几年的明星编程语言,可以说是最出圈的一门语言。有许多不是从事计算机行业的人都听说过python,小破站、各种搜索引擎的广告轰炸也是让人防不胜防。今天就来体验一下。。。
Python的发展方向主要分为以下几点:
- Web开发
- 网络爬虫
- 数据分析
- 人工智能和机器学习
- 自动化测试
- 自动化运维
- ...
今天我们就来体验一下爬虫,正所谓"爬虫爬的好,牢饭不会少。"
环境配置
我们去官网选择好Python版本进行下载,一键安装即可。记得要配置环境变量。www.python.org/
然后在cmd中输入python命令。
看见对应的python信息即环境已经安装完毕。
Requests库
python中的库概念相当于Java中一个个jar包依赖。爬虫,作为一次在互联网上的虫子,我们首先要上网。当然Python也提供传统的网络编程,不过python最方便的就是已经存在好了各种各样的库。所以我们这次就直接安装下载Requests
库。requests.readthedocs.io/en/latest/
安装也很方便,类似前端Vue使用npm install命令,python使用的是pip
工具。
python -m pip install requests
根据文档我们可以发现使用requests.get()
是发送get请求,使用requests.post()
是发送post请求。
我们使用get请求百度。
python
import requests
response = requests.get("https://www.baidu.com")
print(response.status_code)
print(response.text)
- 通过status_code查看状态码
- 通过text查看响应的内容
- 更多的可以查看官方文档api
接着我们来访问一下豆瓣电影前250榜单
我们把地址变成movie.douban.com/top250
python
import requests
response = requests.get("https://movie.douban.com/top250")
print(response.status_code)
print(response.text)
可以发现返回的状态码为418
,这个是什么意思呢?我们搜索一下
I'm a teapot.
我只是一个杯具(茶壶)。所以无法处理请求,服务器知道你不是正常行为访问网址的,算一个梗。
这是因为我们使用get请求访问没有配置其他的Http参数,而是使用库默认的导致被网站的反爬虫机制给识别出来了。所以我们要模拟的像我们人通过浏览器访问这个页面一样,这里我们要给它的请求头加上User-Agent即可。那么我们要加上什么值呢?很简单,打开浏览器访问一个页面,然后使用开发者工具,随便查看一个网络请求,将它这个值复制过来。。。
这个请求头python需要的是一个字典,即对应我们Java里面的HashMap,是一个Key-Value结构。参数名为headers
- Key就是User-Agent
- Value就是传的值
python
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
response = requests.get("https://movie.douban.com/top250", headers=headers)
print(response.status_code)
print(response.text)
成功访问~
BeautifulSoup库
当我们能使用代码正确访问网页,并且拿到网页信息,那么剩下的就是解析这些html代码,从中拿到我们所需要的数据了。
Beautiful Soup 是一个 可以从 HTML 或 XML 文件中提取数据的 Python 库。它能用你喜欢的解析器和习惯的方式实现 文档树的导航、查找、和修改。它会帮你节省数小时甚至数天的工作时间。可以称为"靓汤"。
安装方式也十分的简单
pip install beautifulsoup4
使用起来也很简单,只要把我们请求返回的响应内容传入BeautifulSoup,并设置为html.parser
解析即可。因为BeautifulSoup同时也支持解析xml。
同时如果我们想获取到页面的第一个meta
标签的,内容那么只要使用find()
传入标签名即可,默认是找到第一个符合的标签内容。
python
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
response = requests.get("https://movie.douban.com/top250", headers=headers)
print(response.status_code)
print(response.text)
soup = BeautifulSoup(response.text, "html.parser")
print(soup.find("meta"))
当然我们不能忘了引入该库。
爬虫抓取豆瓣电影Top250电影名
通过使用这两个库,我们应该就能实现一些简单的数据获取了。这里我们想获取豆瓣电影Top250的电影名。那么我们就应该分析这些电影名在页面上在什么位置呢?
feb2ed66744~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=2560&h=1407&s=395957&e=png&b=fefefe)
我们可以发现它存在div标签class为hd下,span标签class名为title里面,我们只要取第一个名字即可,即第一个title。
python
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
response = requests.get("https://movie.douban.com/top250", headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
div = soup.findAll("div", attrs={"class": "hd"})
for d in div:
span = d.find("span", attrs={"class": "title"})
print(span.string)
soup.findAll("div", attrs={"class": "hd"}
找到页面中所有div标签并且class属性为hd的。d.find("span", attrs={"class": "title"})
在1的前提下,找到里面第一个符合为span标签并且class属性为title的。span.string
获取span标签包含的值。
我们成功获取到了这一页的所有电影名,那么怎么获取到剩下的电影名呢?我们点击第二页
movie.douban.com/top250?star...
它是通过start参数来控制的,那么我们只要将上面的封装成一个方法,循环调用10次,并且改变对应的start参数值即可。当然我们也发现其实这个span只要取第一个即可,因为这三个都有class为title,所以代码可以进行修改。
python
import requests
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"
}
def douban(page: int) -> None:
response = requests.get(f'https://movie.douban.com/top250?start={page * 25}&filter=', headers=headers)
print(response.status_code)
soup = BeautifulSoup(response.text, "html.parser")
all_titles = soup.findAll("div", attrs={"class": "hd"})
for title in all_titles:
# print(title)
print(title.find("span").string)
for i in range(10):
douban(i)
成功获取到豆瓣电影Top250的电影名。
这一路用下来,发现使用python的确是非常简单的,拥有许多强大的库,可以使用非常短的代码且方便的实现小功能。
当然这只是一个初体验,不能说明爬虫就是这么简单。只是对比Java、C、C++实现起来是相对简单方便不少。 所以------ 人生苦短我用Python~~~