Python爬取图片是一个常见的网络爬虫应用场景。这里,我将提供一个简单的示例,这段代码是一个Python脚本,用于从网站抓取图片并保存到本地文件夹中。它使用了几个Python库来完成任务,包括os.path(尽管在代码片段中直接导入的是os模块,但用于检查文件夹是否存在和创建文件夹),fake_useragent(用于生成随机的用户代理字符串以模拟不同的浏览器请求),requests(用于发送HTTP请求),以及lxml的etree(用于解析HTML内容)。
以下为爬虫爬取某网页的相关代码与详解。
1.导入必要的库:
import os:实际上,代码中使用了os模块而不是os.path,但通常os.path被用于路径操作。这里,os模块用于检查文件夹是否存在和创建文件夹。
import fake_useragent:是一个 Python 包,它用于生成随机的用户代理(User-Agent)字符串。用户代理字符串是一种在HTTP请求中发送给服务器,以标识发起请求的客户端(如浏览器)的类型、版本、操作系统等信息的字符串。
import requests:用于发送HTTP请求。这是Python中非常流行的HTTP客户端库,简单易用。
from lxml import etree:用于解析HTML和XML文档。它提供了强大的XPath和XSLT功能,使得从HTML文档中提取信息变得容易。
(注意:如有相关库未安装,可通过pip install操作来进行安装,例如安装requests库,我们可以pip install requests,直接进行安装就可以了。)
import os.path
import fake_useragent
import requests
from lxml import etree
2.设置请求头:
通过 fake_useragent.UserAgent().random 生成一个随机的用户代理字符串,并将其设置为请求头的 User-Agent。这有助于伪装爬虫的身份,减少被网站封禁的风险。
# UA伪装
head = {
"User-Agent": fake_useragent.UserAgent().random
}
3.定义全局变量:
pic_name = 0:用于生成图片文件的名称。这里我们从0开始生成,每添加一张照片名称往上加1.
pic_name = 0
4.定义request_pic函数:
这个函数接受一个URL作为参数,用于抓取该URL指向的页面上的图片。
使用requests.get发送请求,并将响应内容赋值给res_text。
使用etree.HTML解析HTML内容,并存储在tree变量中。
通过XPath表达式查找页面上的图片链接(假设它们位于
- 中的
- 元素内)。
遍历找到的 - 元素,提取每个图片链接,并发送另一个请求来获取图片内容。
将图片内容写入到本地文件中,文件名由pic_name变量生成,并递增pic_name以生成不同的文件名。
def request_pic(url):
# 2.发送请求
response = requests.get(url, headers=head)
# 3.获取需要的数据
res_text = response.text
# 4.数据解析
tree = etree.HTML(res_text)
# print(res_text)
li_list = tree.xpath("//div[@class='slist']/ul/li")
print(li_list)
for li in li_list:
# 1.url
img_url = "https://pic.netbian.com"+"".join(li.xpath(".//a/img/@src"))
print(img_url)
# 2.发送请求
img_response = requests.get(img_url, headers=head)
# 3.获取需要的数据
img_content = img_response.content
global pic_name
with open(f"pictures/{pic_name}.jpg", "wb") as fp:
fp.write(img_content)
pic_name += 1
5.主程序:
检查是否存在名为pictures的文件夹,如果不存在则创建它。
定义一个起始URL,并循环遍历多个分页URL(从index_2.html到index_9.html)。对每个分页URL调用request_pic函数来抓取图片。
if __name__ == '__main__':
if not os.path.exists("pictures"):
os.mkdir("pictures")
# 1.url
url = f"https://pic.netbian.com/4kdongman/"
# request_pic(url)
for i in range(2,10):
next_url = f"https://pic.netbian.com/4kdongman/index_{i}.html"
request_pic(next_url)
pass