python爬虫爬小姐姐示例代码
爬虫爬取小姐姐图片示例代码
- 导言
1.1 介绍
1.2 目的 - 环境准备
2.1 Python
2.2 requests
2.3 lxml
2.4 os
2.5 concurrent - 过程
3.1 下载图片函数
3.2 处理单个页面函数
3.3 主函数 - 总结
1. 导言
1.1 介绍
本文将介绍如何使用 Python 编写一个爬虫程序,自动下载小姐姐的图片。本文将提供完整的示例代码,并详细讲解代码的实现细节。
1.2 目的
本文的目的是帮助读者学习 Python 爬虫编程技巧,了解爬虫的基本原理,并掌握如何使用 requests 和 lxml 库编写简单的爬虫程序。
2. 环境准备
在开始编写爬虫程序之前,我们需要准备好以下环境:
2.1 Python
Python 是一种高级的、解释型的、面向对象的编程语言。Python 具有简洁、明确、易读的语法特点,使得 Python 代码具有很高的可读性和可维护性。在本文中,我们将使用 Python 3.8.5 版本。
2.2 requests
requests 是一个 Python 的第三方库,用于发送 HTTP/1.1 请求。它可以发送 GET、POST、PUT、DELETE、OPTIONS、HEAD 请求,并支持 HTTP/HTTPS 协议的各种认证方式。在本文中,我们将使用 requests 库发送 HTTP 请求,获取小姐姐的图片链接。
2.3 lxml
lxml 是一个 Python 的第三方库,用于解析 XML 和 HTML 文档。它提供了一种高效的解析方式,可以快速地解析大型的 XML 和 HTML 文档。在本文中,我们将使用 lxml 库解析 HTML 文档,获取小姐姐的图片链接。
2.4 os
os 是 Python 的一个标准库,提供了一些与操作系统交互的函数。在本文中,我们将使用 os 库创建和删除文件夹,保存下载的图片。
2.5 concurrent
concurrent 是 Python 的一个标准库,提供了一些并发编程的工具。在本文中,我们将使用 concurrent.futures 模块提供的 ThreadPoolExecutor 类实现线程池并发下载图片。
3. 过程
3.1 下载图片函数
首先,我们需要编写一个函数,用于下载一张图片。这个函数需要接收两个参数,一个是图片的链接,另一个是保存图片的路径。函数的实现如下:
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)
# 打印一个消息,指示图片已经下载完成
3.2 处理单个页面函数
接下来,我们需要编写一个函数,用于处理单个页面。这个函数需要接收一个参数,即页面的页码。函数的实现如下:
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)
# 获取所有文章链接
mail_url = html.xpath('//div[@class="excerpts"]/article/a/@href')
# 遍历所有文章链接
for url in mail_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'J:/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)
3.3 主函数
最后,我们需要编写一个主函数,用于启动整个爬虫程序。这个函数需要使用 ThreadPoolExecutor 类并发处理所有页面。函数的实现如下:
if __name__ == '__main__':
# 使用线程池并发处理所有页面
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = []
for page in range(1, 573):
futures.append(executor.submit(process_page, page))
for future in concurrent.futures.as_completed(futures):
pass
4. 总结
本文介绍了如何使用 Python 编写一个爬虫程序,自动下载小姐姐的图片。本文提供了完整的示例代码,并详细讲解了代码的实现细节。通过本文的学习,读者可以了解爬虫的基本原理,掌握如何使用 requests 和 lxml 库编写简单的爬虫程序。
完整代码
import time
import requests
from lxml import etree
import os
import concurrent.futures
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)
# 打印一个消息,指示图片已经下载完成
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)
# 获取所有文章链接
mail_url = html.xpath('//div[@class="excerpts"]/article/a/@href')
# 遍历所有文章链接
for url in mail_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'J:/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 = []
for page in range(1, 573):
futures.append(executor.submit(process_page, page))
for future in concurrent.futures.as_completed(futures):
pass