前言
应社团需求,在已有其他语言基础的前提下,简略过完python基础语法后,进行python爬虫实践
一、python的基础语法
安装
要使用 Python ,首先要把它安装到你电脑里。打开 Python 官网 下载安装包。 thon 官网 下载安装包。
然后打开命令行(在开始菜单搜索“CMD”),看看能不能输出 Python 版本号。如果能输出就证明安装成功
python --version
# 或者
# 大写V前面1个横杠
python -V
编辑器**
我推荐的编辑器有 PyCharm,VS Code 和 Jupyter Notebook。
基础用法
环境搭建好就开始学一下 Python 的基础用法吧,本文只讲基础用法,不涉及高阶用法,学完立刻应用,不会伤到初学者的信心。
打印输出
打印输出内容的方法是 print() ,在括号里放入要输出的内容,运行后就会输出到控制台。
在 Python 里,创建一个变量的语法如下:
变量名 = 值
注释
注释的作用是告诉别人或者日后的自己,这段代码是用来干嘛的。
在 Python 里,使用 # 表示单行注释,使用6个双引号将内容包裹起来就形成多行注释。
# 这是单行注释
"""
这是多行注释 第1行
这是多行注释 第2行
这是多行注释 第3行
……
"""
数学运算
数学运算主要包括我们义务教育里学的加减乘除,除此之外 Python 还提供了求余等方法。
| 运算符 | 例子 | 结果 |
|---|---|---|
| +:加法 | 1 + 1 | 2 |
| -:减法 | 1 - 1 | 0 |
| *:乘法 | 10 * 2 | 20 |
| /:除法 | 10 / 3 | 3.3333333333333335。最后这个5是因为浮点数不精确问题导致的,初学者可以先不管这个5。 |
| //:整除 | 10 // 3 | 3 |
| %:求余 | 10 % 3 | 1 |
| **: 次方 | 2 ** 3 | 8。意思是2的3次方。 |
比较运算
所谓的比较,就是大于、小于、等于……
使用比较运算符会得到一个布尔类型的结果,也就是真或者假。
| 运算符 | 例子 | 结果 |
|---|---|---|
| ==:等于 | 1 == 10 | False |
| !=:不等于 | 1 != 10 | True |
| >:大于 | 1 > 1 | False |
| >=:大于等于 | 1 >= 1 | True |
| <:小于 | 1 < 1 | False |
| <=:小于等于 | 1 <= 1 | True |
条件判断
所谓的条件判断,简单来说就是“看情况”。就是“如果...否则...”的句式。
在 Python 里,用 if...else... 表示这个句式。
代码块1
else:
代码块2
```需要注意的是,`Python` 是按照缩进来划分代码块的。
举个例子
```age = 18
if age >= 18:
print("可以喝一点点酒")
else:
print("一点酒都不能碰")
输出:"可以喝一点点酒"
条件运算符
条件运算符通常会配合前面说的条件判断一起使用。
Python 里的条件运算符有“与、或、取反”。
| 运算符 | 例子 | 结果 |
|---|---|---|
| and:与。and两边的条件都为True时,结果才为True | 3 > 2 and '雷猴' == '鲨鱼辣椒' | False |
| or:或。or两边的条件只要有一个为True时,结果就为True | 3 > 2 or '雷猴' == '鲨鱼辣椒' | True |
| not:取反。 | not 1 > 0 | False |
循环
Python 里有 for 和 while 两种循环。初学者可以先学 for,用熟了再自行了解 while 吧。
for 的用法如下:
for 项 in 序列:
代码块
列表
列表是用于保存批量的数据类型。 比如我们需要将各种水果存进唯一一个变量就可使用列表
fruit_list=[apple,banana,orange,pee,purplr]
Python 还提供了很多列表相关的方法,比如
# len: 查看列表长度
# append: 在列表末尾添加元素
# insert: 在列表指定位置插入元素
# remove: 删除指定值的元素
# pop: 删除指定索引的元素
字典
字典是用来存储键值对的数据类型,和现实世界中的字典一样。我们打开新华字典,可以根据拼音或者偏旁部首查到到指定的字放在字典里的哪一页。
在 Python 的字典里,可以通过“键名”找到对应的“值”。“键”是用来定位数据的,重点在定位。“值”是用来存放数据的,重点是存放。
Python 的字典用花括号 {} 表示,键值对用冒号 : 关联。多个键值对用逗号 , 分隔。
如
grade = {
"Python": 100,
"Java": 88,
"C++": 60,
"JavaScript": 70
}
要查看字典里的值,可以用键来获取。取值的方法是 字典名[键名]
以上为基础语法介绍,下面介绍爬虫
1、什么是爬虫
Python爬虫是指使用Python语言编写的用于从互联网上抓取数据的程序。爬虫程序可以模拟浏览器的行为,访问网站,获取网页内容,然后从这些内容中提取有用的信息。这些信息可以是文本、图片、视频等。
2、简单的爬虫实现
安装拓展包
想要爬取网页资源,首先需要向网页发送一个http请求(HTTP请求(HyperText Transfer Protocol Request)是客户端(如浏览器)向服务器请求数据或服务时发送的消息。HTTP是基于TCP/IP协议的应用层通信协议,用于从万维网(WWW)服务器传输超文本到本地浏览器的传输协议。),这通常会用到request库。想要安装request库,可以在使用的编辑器中终端输入下方代码
pip install requests
如果安装了aconda则可省略此步骤 安装完成后可以通过
import requests
来调用
发送GET请求
get 请求只从网页获取信息可以通过下方代码向一个网页发送get请求
import requests
# 目标 URL
url = 'http://httpbin.org/get'
# 发送 GET 请求
response = requests.get(url)
# 打印响应的文本内容
print(response.text)
# 打印响应的状态码
print(response.status_code)
# 打印响应的头部信息
print(response.headers)
发送post请求
如果你想发送 POST 请求,可以这样做:
import requests
# 目标 URL
url = 'http://httpbin.org/post'
# 要发送的数据
data = {
'key1': 'value1',
'key2': 'value2'
}
# 发送 POST 请求
response = requests.post(url, data=data)
# 打印响应的文本内容
print(response.text)
所谓url通俗点就是网址
在发送get请求之后,我们可以通过print(response.status_code)来获取网页的响应状态,以下是一些状态码的介绍,了解即可
1xx(信息性状态码)
- 100 Continue:服务器已接收到请求的初始部分,客户端应继续发送剩余部分。
2xx(成功状态码)
- 200 OK:请求成功,服务器返回所请求的资源。
- 201 Created:请求成功,服务器创建了新的资源。
- 202 Accepted:服务器已接受请求,但尚未处理。
3xx(重定向状态码)
- 301 Moved Permanently:请求的资源已被永久移动到新位置。
- 302 Found:请求的资源临时被移动到另一个URI。
- 304 Not Modified:自从上次请求后,资源未修改,可使用缓存的版本。
4xx(客户端错误状态码)
- 400 Bad Request:服务器无法理解请求格式,客户端请求错误。
- 401 Unauthorized:请求需要用户的身份认证。
- 403 Forbidden:服务器理解请求,但是拒绝执行。
- 404 Not Found:服务器找不到请求的资源。
5xx(服务器错误状态码)
- 500 Internal Server Error:服务器遇到错误,无法完成请求。
- 501 Not Implemented:服务器不支持请求的功能,无法完成请求。
- 503 Service Unavailable:服务器当前无法处理请求,通常是因为服务器过载或维护。
对于一般网站我们都可以成功获得服务器的请求返回,也就是状态码为200,但是在市面上也有许多网页,它们只希望回应由浏览器发出了请求,而不希望回应程序发出的请求,这时我们可以通过修改User-Agent的值来伪装成浏览器,具体操作如下:
1、 随意找到一个网站,右键点击检查,进入network(网络)后刷新网页,就可以看到该网页浏览器发送的各种http请求
2、点击任意请求,找到user-agent:将其后方数据复制
3.将我们所复制的内容赋值给headers,并在请求中把headers传入给参数headers:
这之后就可以将我们的代码伪装成浏览器来发送get请求
####成功伪装成浏览器发送get请求后可以通过
print(response.text)
# 打印响应的html源码
####什么是html可参考文章 [](HTML简介:想成为前端开发者?先从掌握HTML开始!在这个数字化的时代,我们每天都在与网页打交道。你是否曾经好奇过,这 - 掘金 (juejin.cn)) 在学习html的相关概念后可以在编辑器中自己创建一个html后缀的文件来试着自己做一个极为简陋又简陋的网页 附上本人学习的代码
<!DOCTYPE HTML>
<html>
<head>
<title>
页面标签
</title>
</head>
<body>
<div style="background: blue;">
<h1>这是一个一级标题目</h1>
<h2>这是一个二级标签</h2>
<h6>这是一个六级标题</h6>
<p>文本文本文本<b>b标签加粗字体</b><i>i标签变为斜体</i><u>u标签内文字加下划线</u><br>此处br标签换行</p>
</div>
<img src="http://t7.baidu.com/it/u=1415984692,3889465312&fm=193&f=GIF" width="500px">
<ol>
<li>ykk</li>
<li>tk</li>
<li>zrh</li>
</ol>
<ul>
<li>lyp</li>
<li>zjy</li>
<li>lyx</li>
</ul>
<table border="10">
<thead>
<tr>
<td>头部1</td>
<td>头部2</td>
<td>头部3</td>
</tr>
</thead>
<tbody>
<tr>
<td>111</td>
<td>222</td>
<td>333</td>
</tr>
<tr>
<td>444</td>
<td>555</td>
<td>666</td>
</tr>
<tr>
<td>777</td>
<td>888</td>
</tr>
</tbody>
</table>
<a href="http://www.baidu.com" target="_blank">百度链接</a>
</body>
</html>
在我们用grt获得了网页的html信息之后,我们会发现html信息可以非常复杂,这时候需要用到另外一个外部库Beautifulsoup来解析我们所获得的html信息,安装Beautifulsoup同样可在编辑器终端输入
pip install bs4
之后在代码中的调用
from bs4 import Beautifulsoup
之后我们将get所获得的信息通过Beautifulsoup的构造函数解析,其中需要将features参数设置为"html.parser"
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/128.0.0.0 Safari/537.36 Edg/128.0.0.0"}
response=requests.get(f"https://jwxt.sztu.edu.cn/jsxsd/framework/xsMain.htmlx",headers=headers)
html=response.text
soup=BeautifulSoup(html,"html.parser")
这之中soup作为Beautifulsoup的对象具有许多属性和方法来获取信息,如打印print(soup.p)就会返回这html信息中的第一个p标签元素以及其子元素标签,同理如打印print(soup.img)则会返回第一个图片元素
findall方法的使用
Beautifulsoup中有个findall方法,可以帮我们找到所有符合要求的元素,而非上文那般只有第一个元素
soup=BeautifulSoup(html,"html.parser")
all_titles=soup.find_all("span",attrs={"class":"title"})
此代码可找出所有标签为span,且class属性为title的值 在打印时,可以通过打印字符串形式print(xxx.string)来打印文本而省略标签
以上为爬虫的基础知识,最后附带爬取豆瓣电影网前250电影名的实战爬虫python代码
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/128.0.0.0 Safari/537.36 Edg/128.0.0.0"}
for start_num in range(0,250,25):
response=requests.get(f"https://movie.douban.com/top250?start={start_num}",headers=headers)
html=response.text
soup=BeautifulSoup(html,"html.parser")
all_titles=soup.find_all("span",attrs={"class":"title"})
for title in all_titles:
title_string=(title.string)
if "/"not in title_string:
print(title_string)