qidao123.com技术社区-IT企服评测·应用市场

标题: 爬虫项目之利用多线程爬取4K桌面网站壁纸 [打印本页]

作者: 没腿的鸟    时间: 2025-4-19 10:45
标题: 爬虫项目之利用多线程爬取4K桌面网站壁纸
爬虫项目之利用多线程爬取4K桌面网站美女壁纸

这次的目的网址是:https://www.bizhi888.com/e/sch/index.php?page=0&keyboard=美女&field=2&sear=1
思绪:由于这次搜索的目的网页是分页式的,以是采用requests+lxml技能爬取数据。但是这次的网站图片数据累计4296张图片,如果采用单线程爬取这些数据,那么爬完所有数据将多花费一些时间,而如果采用多线程ThreadPoolExecutor技能,那么爬取数据的速度将会大大提高。
下面是目的网页

第一步:将所有页面的url链接封装成一个集合

由于所有页面的的url链接只有一个参数不同,所有采用循环的方式,将其封装成一个列表url_list并返回。
  1. def create_urls():
  2.     url_list =[]
  3.     url = 'https://www.bizhi888.com/e/sch/index.php?page=0&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
  4.     #共计120页图片
  5.     for page in range(10,120):
  6.         url = f'https://www.bizhi888.com/e/sch/index.php?page={page}&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
  7.         url_list.append(url)
  8.     return url_list
复制代码
第二步:封装好下载图片功能

img_url_dict是一个字典,键是图片的名字,值是图片的url,这样封装好后,方便后面的调用。
  1. def download_img(img_url_dict):
  2.     if os.path.exists(f'./img')==False:
  3.         os.makedirs(f'./img')
  4.     for key in img_url_dict:
  5.         resp = requests.get(img_url_dict[key],headers=header)
  6.         with open(f'./img/{key}','wb') as f:
  7.             f.write(resp.content)
  8.         f.close()
复制代码
第三步:编写爬虫程序

下面是爬虫模块,其中将图片的src链接中的newpc202302替换成lan20221010,可以提高图片的清晰度,只管最终得到的图片依然不是4K高清的,但已经较为清晰。
  1. #爬虫模块
  2. def spider(url):
  3.     #数据字典
  4.     img_url_dict = {}
  5.     #爬取网页源代码
  6.     resp = requests.get(url,headers=header)
  7.     resp.encoding='utf8'
  8.     #使用etree解析源码
  9.     html = etree.HTML(resp.text)
  10.     #找到所有图片的标签
  11.     a_list = html.xpath('/html/body/div[4]/a')
  12.     for a in a_list:
  13.         #获取图片的src
  14.         img_src = a.xpath('img/@data-original')[0]
  15.         #将src链接中的newpc202302替换成lan20221010,则提高图片的清晰度
  16.         img_url = img_src.replace('newpc202302','lan20221010')
  17.         #取链接最后15位为图片的名字
  18.         img_name = img_url[-15:]
  19.         #将name和url添加进集合
  20.         img_url_dict[img_name] = img_url
  21.     #下载图片   
  22.     download_img(img_url_dict)
  23.     #爬完一页后打印到控制台
  24.     global page
  25.     print(f'第{page}页数据爬取完成!')
  26.     page+=1
复制代码
第四步:执行程序

利用ThreadPoolExecutor函数,开五个线程同时爬取网页图片
  1. if __name__ == '__main__':
  2.     #创建url列表
  3.     url_list = create_urls()
  4.     #使用多线程爬取网页数据
  5.     with ThreadPoolExecutor(5) as t:
  6.         for url in url_list:
  7.             t.submit(spider(url))
复制代码
最后是网页源代码
  1. import requestsfrom lxml import etreeimport osfrom concurrent.futures import ThreadPoolExecutorheader = {    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0'}page=1# 将需要的网页网址加入到url_list列表,方便后面多线程爬取def create_urls():
  2.     url_list =[]
  3.     url = 'https://www.bizhi888.com/e/sch/index.php?page=0&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
  4.     #共计120页图片
  5.     for page in range(10,120):
  6.         url = f'https://www.bizhi888.com/e/sch/index.php?page={page}&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
  7.         url_list.append(url)
  8.     return url_list#爬虫模块def spider(url):    #数据字典    img_url_dict = {}    #爬取网页源代码    resp = requests.get(url,headers=header)    resp.encoding='utf8'    #利用etree解析源码    html = etree.HTML(resp.text)    #找到所有图片的标签    a_list = html.xpath('/html/body/div[4]/a')    for a in a_list:        #获取图片的src        img_src = a.xpath('img/@data-original')[0]        #将src链接中的newpc202302替换成lan20221010,则提高图片的清晰度        img_url = img_src.replace('newpc202302','lan20221010')        #取链接最后15位为图片的名字        img_name = img_url[-15:]        #将name和url添加进集合        img_url_dict[img_name] = img_url    #下载图片    download_img(img_url_dict)    #爬完一页后打印到控制台    global page    print(f'第{page}页数据爬取完成!')    page+=1def download_img(img_url_dict):    if os.path.exists('./img')==False:        os.makedirs('./img')    for key in img_url_dict:        resp = requests.get(img_url_dict[key],headers=header)        with open('./img/{key}','wb') as f:            f.write(resp.content)        f.close()if __name__ == '__main__':
  9.     #创建url列表
  10.     url_list = create_urls()
  11.     #使用多线程爬取网页数据
  12.     with ThreadPoolExecutor(5) as t:
  13.         for url in url_list:
  14.             t.submit(spider(url))
复制代码
下面让我们看结果


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4