找回密码
 立即注册
首页 群组 IT互联网 网站 程序园子 爬虫项目之使用多线程爬取4K桌面网站壁纸 ...

爬虫项目之使用多线程爬取4K桌面网站壁纸

事确 2025-5-29 18:20:42
爬虫项目之使用多线程爬取4K桌面网站美女壁纸

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

第一步:将所有页面的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))
复制代码
下面让我们看结果
2.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!