Python 爬虫是一项强大的技能,它可以帮助我们从互联网上自动获取数据。然而,除了用于实际的数据采集,爬虫还经常被用来获取一些有趣的内容,比如小姐姐的照片。本教程将向您展示如何使用 Python 编写一个简单的爬虫程序,以自动下载小姐姐的图片。无需担心,我们将详细解释每一步,让您轻松掌握这项技能。
目的
本教程的目的是帮助初学者了解 Python 爬虫编程技巧,掌握爬虫的基本原理,并学会使用 requests 和 lxml 库编写一个小型爬虫程序。通过学习这个示例,您将能够更好地理解如何获取网页内容并处理数据,为以后的爬虫项目打下坚实的基础。
环境准备
在开始编写爬虫程序之前,我们需要确保以下环境准备已完成。
Python
首先,确保您已经安装了 Python。我们建议使用 Python 3.8.5 版本或更高版本,因为这个示例程序是在 Python 3 环境下编写的。
requests
我们将使用 requests 库来发送 HTTP 请求以获取网页内容。如果您尚未安装 requests 库,可以使用以下命令进行安装:
pip install requests
lxml
lxml 是一个用于解析 XML 和 HTML 文档的库,它在我们解析网页时非常有用。如果您尚未安装 lxml 库,可以使用以下命令进行安装:
pip install lxml
os
Python 内置的 os 库用于操作操作系统功能,我们将使用它来创建文件夹和保存下载的图片。
concurrent
concurrent 是 Python 的标准库,用于处理并发任务。我们将使用 concurrent.futures 模块中的 ThreadPoolExecutor 类来实现线程池并发下载图片。
现在,让我们开始编写代码。
过程
下载图片函数
首先,我们需要编写一个函数,用于下载单张图片。这个函数将接受两个参数:图片的链接(URL)和保存图片的路径。以下是这个函数的代码:
import requests
import os
def download_image(url, img_path):
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送 GET 请求到指定的 URL
response = requests.get(url, headers=headers)
# 从 URL 中提取图片名称
img_name = url.split('/')[-1]
# 以二进制模式打开图片文件并将响应内容写入其中
with open(os.path.join(img_path, img_name), 'wb') as f:
f.write(response.content)
# 打印一个消息,指示图片已经下载完成
print(f"已下载图片:{img_name}")
处理单个页面函数
接下来,我们需要编写一个函数,用于处理单个页面。这个函数将接受一个参数:页面的页码。以下是这个函数的代码:
import requests
from lxml import etree
import os
import concurrent.futures
import time
def process_page(page):
# 拼接 URL
url = f'https://www.xiezhen.xyz/page/{page}'
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送 GET 请求到指定的 URL
response = requests.get(url, headers=headers)
# 将响应内容解析为 HTML
html = etree.HTML(response.content)
# 获取所有文章链接
main_url = html.xpath('//div[@class="excerpts"]/article/a/@href')
# 遍历所有文章链接
for url in main_url:
# 发送 GET 请求到文章链接
response = requests.get(url, headers=headers)
# 将响应内容解析为 HTML
html = etree.HTML(response.content)
# 获取所有图片链接
sub_url = html.xpath('//article/p/img')
# 获取图片标题
img_title = html.xpath('//title/text()')[0].split('-')[0]
# 设置图片路径
img_path = f'./xiezhen/{img_title}'
# 如果图片路径不存在,则创建它
if not os.path.exists(img_path):
os.makedirs(img_path)
# 使用线程池并发下载所有图片
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
for s_url in sub_url:
img_url = s_url.attrib['src']
futures.append(executor.submit(download_image, img_url, img_path))
for future in concurrent.futures.as_completed(futures):
pass
# 暂停 0.5 秒,避免请求过于频繁
time.sleep(0.5)
主函数
最后,我们需要编写一个主函数,用于启动整个爬虫程序。这个函数将使用 ThreadPoolExecutor 类并发处理所有页面。以下是主函数的代码:
import concurrent.futures
if __name__ == '__main__':
# 使用线程池并发处理所有页面
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
# 假设有 572 页需要处理
for page in range(1, 573):
futures.append(executor.submit(process_page, page))
for future in concurrent.futures.as_completed(futures):
pass
总结
通过本教程,我们学习了如何使用 Python 编写一个简单的爬虫程序,自动下载小姐姐的图片。我们讲解了每个步骤的细节,并提供了完整的示例代码。爬虫编程是一个有趣且实用的技能,它可以让我们自动化地获取网页上的数据,但请务必谨慎使用,遵守法律法规和网站的规定。
希望这个示例代码对您有所帮助,让您更好地理解爬虫编程的基本原理。如果您想进一步学习爬虫编程,可以尝试挑战更复杂的项目,探索更多高级技术和工具。
完整代码
以下是完整的 Python 爬虫示例代码:
import requests
from lxml import etree
import os
import concurrent.futures
import time
def download_image(url, img_path):
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送 GET 请求到指定的 URL
response = requests.get(url, headers=headers)
# 从 URL 中提取图片名称
img_name = url.split('/')[-1]
# 以二进制模式打开图片文件并将响应内容写入其中
with open(os.path.join(img_path, img_name), 'wb') as f:
f.write(response.content)
# 打印一个消息,指示图片已经下载完成
print(f"已下载图片:{img_name}")
def process_page(page):
# 拼接 URL
url = f'https://www.xiezhen.xyz/page/{page}'
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送 GET 请求到指定的 URL
response = requests.get(url, headers=headers)
# 将响应内容解析为 HTML
html = etree.HTML(response.content)
# 获取所有文章链接
main_url = html.xpath('//div[@class="excerpts"]/article/a/@href')
# 遍历所有文章链接
for url in main_url:
# 发送 GET 请求到文章链接
response = requests.get(url, headers=headers)
# 将响应内容解析为 HTML
html = etree.HTML(response.content)
# 获取所有图片链接
sub_url = html.xpath('//article/p/img')
# 获取图片标题
img_title = html.xpath('//title/text()')[0].split('-')[0]
# 设置图片路径
img_path = f'./xiezhen/{img_title}'
# 如果图片路径不存在,则创建它
if not os.path.exists(img_path):
os.makedirs(img_path)
# 使用线程池并发下载所有图片
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
for s_url in sub_url:
img_url = s_url.attrib['src']
futures.append(executor.submit(download_image, img_url, img_path))
for future in concurrent.futures.as_completed(futures):
pass
# 暂停 0.5 秒,避免请求过于频繁
time.sleep(0.5)
if __name__ == '__main__':
# 使用线程池并发处理所有页面
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
# 假设有 572 页需要处理
for page in range(1, 573):
futures.append(executor.submit(process_page, page))
for future in concurrent.futures.as_completed(futures):
pass
现在,您已经学会了如何使用 Python 编写一个爬虫程序来下载小姐姐的图片。祝您编写愉快,爬虫之旅愉快!