Python爬虫图片及相关知识讲解

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获取当前用户桌面路径

    py 复制代码
    import 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
相关推荐
一点媛艺2 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生3 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
_.Switch3 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
老猿讲编程4 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
Chrikk4 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*5 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue5 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang