前言
在互联网开发领域,数据抓取是一项非常实用的技术。通过数据抓取,我们可以从网页上获取所需的信息,并将其转化为结构化数据,以便进一步分析或使用。本文将介绍如何利用Python编写一个多线程程序来抓取网页上的图片数据,并将其下载到本地。
目标网站
1. 环境准备
在开始之前,请确保您的环境中已安装以下Python包:
DrissionPage
:这是一个强大的网页操作库,支持多种浏览器,可以方便地进行页面加载、元素查找等操作。fake_useragent
:用于生成随机的User-Agent,模拟不同的浏览器访问,减少被网站识别为爬虫的风险。concurrent.futures
:Python标准库中的并发执行模块,这里用来实现多线程抓取。
可以通过pip命令安装这些包:
pip install DrissionPage fake_useragent
2. 编写抓取函数
接下来,我们将定义一个名为fetch_table_data
的函数,该函数负责访问指定网页,抓取图片链接,并将图片保存到本地。
# -*- coding: utf-8 -*-
import concurrent.futures
import time
import random
import os
from DrissionPage import ChromiumPage, ChromiumOptions
from fake_useragent import UserAgent# 定义一个函数来抓取表格数据
def fetch_table_data(num):# 2.1 设置Chromium的选项co = ChromiumOptions()co.set_browser_path(r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")co.set_user_data_path(r"C:\Users\20220\AppData\Local\Microsoft\Edge\User Data\Default")# 2.2 初始化ChromiumPage实例Page = ChromiumPage(addr_or_opts=co)url = f"https://www.doutub.com/img_lists/new/{num}"tab = Page.new_tab(url)tab.wait.load_start()time.sleep(random.uniform(2, 3)) # 随机等待2到3秒,模拟用户行为set_links = set() # 创建一个集合用于存储链接,避免重复# 2.3 遍历页面上的每个表情元素for doutu in tab.eles('x://div[@class="expression-list clearfix"]/div[@class="cell"]'):img = doutu("t:img") # 获取图片元素img_src = img.attr('data-src') # 获取图片的data-src属性值print(img_src)set_links.add(img_src) # 将图片链接添加到集合中img.save(path=r"E:\Python\斗图", name=img_src.split('/')[-1].split('?')[0]) # 保存图片time.sleep(random.uniform(2, 3)) # 再次随机等待2到3秒print(len(set_links)) # 打印抓取到的链接数量print(f"正在抓取第{num}页") # 打印当前抓取的页数信息tab.close() # 关闭标签页
3. 多线程抓取
为了提高效率,我们使用concurrent.futures.ThreadPoolExecutor
来创建一个线程池,这样就可以同时处理多个请求了。
# 3.1 使用线程池来并行处理多个请求
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:# 3.2 提交任务到线程池futures = [executor.submit(fetch_table_data, num) for num in range(1, 3)] # 调整范围以抓取更多或更少的页数# 3.3 等待所有任务完成concurrent.futures.wait(futures)
4.运行结果
5. 注意事项
- 在设置
ChromiumOptions
时,请确保提供的浏览器路径和用户数据路径是正确的,否则可能会导致程序无法正常运行。 - 本示例中使用了
time.sleep()
来模拟用户的随机等待时间,这是为了避免频繁请求导致目标网站封禁IP地址。 - 图片的保存路径也需要根据实际情况进行调整。
以上是使用Python多线程技术抓取网页数据并下载图片的一个完整示例。
如果有爬虫的需求的话可以到,【python爬虫 文档、图片等数据抓取】
请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
使用者自行承担因不当使用代码而产生的任何法律责任