1. 导入所需依赖
sh
pip install requests # 导入request库,用于发起网络请求
re # python自带,不需要导入,正则表达式库,用于匹配规则
os # 系统库,用于操作文件夹、文件
2. requests库介绍
以下是 requests 库的一些主要特点和功能:
发送 HTTP 请求:requests 提供了多种发送 HTTP 请求的方法,包括 GET、POST、PUT、DELETE 等。通过使用这些方法,可以轻松地发送请求到指定的 URL,并获取服务器响应。爬虫发起的请求基本就是GET。
py
# 1. 发送 GET 请求
response = requests.get('https://api.example.com')
# 2. 传递查询参数
params = {'key': 'value'}
response = requests.get('https://api.example.com', params=params)
# 3. 设置请求头部
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://api.example.com', headers=headers)
response = requests.get('https://api.example.com')
print(response.status_code) # 打印状态码
print(response.text) # 打印响应内容
print(response.json()) # 解析为 JSON 对象
print(response.content.decode()) # decode可设置编码
# 发送 POST 请求
payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://api.example.com', data=payload)
# 请求参数和头部:requests 允许在发送请求时传递参数和自定义头部信息。可以通过传递参数字典或设置请求头部来实现。
3. re库介绍
在Python中,re库是一个用于处理正则表达式的内置标准库。正则表达式是一种强大的文本匹配和处理工具,使用它可以进行文本搜索、替换、分割等操作。re库提供了一系列函数,允许你使用正则表达式来对字符串进行复杂的模式匹配和处理。
以下是re库常用的一些函数:
re.match(pattern, string)
:从字符串开头开始匹配,如果匹配成功返回匹配对象,否则返回None。re.search(pattern, string)
:在字符串中搜索匹配,如果匹配成功返回匹配对象,否则返回None。re.findall(pattern, string)
:返回字符串中所有与模式匹配的子串组成的列表。re.sub(pattern, repl, string)
:使用repl替换字符串中与模式匹配的子串。re.split(pattern, string)
:使用模式分割字符串,并返回由分割后的子串组成的列表。
除了这些基本函数之外,re库还提供了一些其他功能,例如支持捕获组、忽略大小写、多行模式等等。使用re库,你可以进行复杂的模式匹配,从而实现对文本的高效处理和提取。
总的来说,re库在Python中的作用是提供了强大的正则表达式功能,使得我们可以轻松地进行文本匹配、提取和处理,是处理文本数据时非常有用的工具之一。
正则表达式中的 pattern 是用来定义匹配规则的字符串。它由各种特殊字符和普通字符组成,用于指定我们要匹配的文本模式。
下面是一些常用的正则表达式特殊字符和符号:
.
:匹配除换行符以外的任意字符。*
:匹配前一个字符零次或多次。+
:匹配前一个字符一次或多次。?
:匹配前一个字符零次或一次。^
:匹配字符串的起始位置。$
:匹配字符串的结束位置。\d
:匹配任意数字字符。\w
:匹配任意字母数字字符。\s
:匹配任意空白字符。[ ]
:用于定义字符集,匹配其中任意一个字符。[^ ]
:用于否定字符集,匹配不在其中的任意字符。
除了上述特殊字符之外,我们还可以使用括号 () 来创建捕获组,并使用 | 来表示多个模式的选择。
例如,假设我们想要匹配一个由数字和字母组成的字符串,可以使用正则表达式 [\w]+
,其中 [] 定义了一个字符集,\w 表示任意字母数字字符,+ 表示前一个字符可以出现一次或多次。
另外,为了方便使用正则表达式,我们可以使用 re.compile()
方法将 pattern 编译成 Pattern 对象。这样可以提高性能,并且可以重复使用编译后的对象进行匹配操作。
4. os库介绍
os 是 Python 内置的一个标准库,提供了许多与操作系统相关的功能和接口,可以让你更方便地访问文件系统、处理文件路径、获取环境变量等。
下面是 os 库中一些常用的功能:
-
os.getcwd()
:获取当前工作目录的路径。 -
os.chdir(path)
:改变当前工作目录到指定的路径。 -
os.listdir(path)
:返回指定目录下所有文件和子目录的列表。 -
os.path.join(path, *paths)
:将多个路径组合成一个路径。 -
os.path.abspath(path)
:返回指定路径的绝对路径。 -
os.path.split(path)
:将路径分解为目录和文件名两部分。(根据文件名后缀分解) -
os.path.splitext(path)
:将路径分解为文件名和扩展名两部分。 -
os.path.basename(path)
:返回指定路径中的文件名部分。 -
os.path.dirname(path)
:返回指定路径中的目录部分。 -
os.path.isdir(path)
:检测给定的路径是否是一个目录。 -
os.path.isfile(path)
:检测给定的路径是否是一个文件。 -
os.makedirs(name)
:创建[递归]目录。 -
os.mkdir(path)
:创建指定路径的目录。 -
os.rename(src, dst)
:将文件或目录从源路径重命名为目标路径。 -
os.remove(path)
:删除指定路径的文件。 -
os.rmdir(path)
:删除指定路径的空目录。 -
os.path.exists(path)
:检查指定路径是否存在。 -
os.path.getsize(path)
:获取指定文件的大小(以字节为单位)。 -
os获取当前用户桌面路径
pyimport os desktop_path = os.path.join(os.path.expanduser("~"), "Desktop") print(desktop_path)
另外,os 库还提供了一些与进程和环境变量相关的功能,如 os.environ 可以获取系统环境变量,os.system(command) 可以执行系统命令等等。这使得 Python 能够与操作系统交互,执行各种任务。
5. 图片爬取
py
import re
import requests
import os
# 1.拿到url
str = input("请输入你要爬取的内容:")
if not os.path.exists(str): # 判断是否存在这个文件夹,如果没有就创建一个以'str'为名字的文件夹
os.mkdir(str)
#UA:User-Agent(请求载体的身份标识)
#UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识额为某一款浏览器
#说明该请求时一个正常的请求,但是,如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为
#不正常的请求(爬虫),则服务器端就很可能拒绝该请求。
#UA伪装:让爬虫对应的请求载体身份标识为某一款浏览器
#UA伪装:将对应的User-agent封装到一个字典中
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
url = "https://image.so.com/i?src=360pic_strong&z=1&i=0&cmg=15484592.&q=%s" % str
# url="https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=%s"%str
# 2.拿到网页源代码
r = requests.get(url=url, headers=headers) # 利用requests模块来获取当前这个url的信息,得到数据
# ret = r.text # ret得到的就是网页源代码,与下一条作用相同
ret = r.content.decode() # ret得到的就是网页源代码,decode()括号中的内容不写默认为'utf-8'编码
# 3.拿到所有图片的url(链接地址)
result = re.findall('"thumb_bak":"(.*?)",', ret) # result是一个列表,根据图片的网页地址匹配,url为thumb_bak和,中的内容,即(.*?)
# 4. 输入要爬取的图片数量
txt = '请输入要爬取的图片数量(< %s):' % len(result)
picNum = int(input(txt))
num = 0
# 4.保存所有图片
for i in result:
i = re.sub(r'\\', '', i) # 与上面的for循环功能一致
print(i)
r = requests.get(i) # 利用requests模块来获取当前这个url的信息,得到数据
path = i[-15:] # 以url的结尾后十位命名
end = re.search('(\.jpg|\.jpeg|\.gif|\.png)$', path) # 加转义字符使小数点成为我们想要的,'|'为或者,'$'为以什么结尾,这里指或者以jpg结尾
if end is None: # 如果后十位不以上面的内容结尾,则在后面加.jpg
path = path + 'rought.jpg'
with open(str + '/' + path, 'wb') as f:
f.write(r.content)
num = num + 1
if num == picNum:
break