爬虫项目之利用多线程爬取4K桌面网站美女壁纸
这次的目的网址是:https://www.bizhi888.com/e/sch/index.php?page=0&keyboard=美女&field=2&sear=1
思绪:由于这次搜索的目的网页是分页式的,以是采用requests+lxml技能爬取数据。但是这次的网站图片数据累计4296张图片,如果采用单线程爬取这些数据,那么爬完所有数据将多花费一些时间,而如果采用多线程ThreadPoolExecutor技能,那么爬取数据的速度将会大大提高。
下面是目的网页
第一步:将所有页面的url链接封装成一个集合
由于所有页面的的url链接只有一个参数不同,所有采用循环的方式,将其封装成一个列表url_list并返回。
- def create_urls():
- url_list =[]
- url = 'https://www.bizhi888.com/e/sch/index.php?page=0&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
- #共计120页图片
- for page in range(10,120):
- url = f'https://www.bizhi888.com/e/sch/index.php?page={page}&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
- url_list.append(url)
- return url_list
复制代码 第二步:封装好下载图片功能
img_url_dict是一个字典,键是图片的名字,值是图片的url,这样封装好后,方便后面的调用。
- def download_img(img_url_dict):
- if os.path.exists(f'./img')==False:
- os.makedirs(f'./img')
- for key in img_url_dict:
- resp = requests.get(img_url_dict[key],headers=header)
- with open(f'./img/{key}','wb') as f:
- f.write(resp.content)
- f.close()
复制代码 第三步:编写爬虫程序
下面是爬虫模块,其中将图片的src链接中的newpc202302替换成lan20221010,可以提高图片的清晰度,只管最终得到的图片依然不是4K高清的,但已经较为清晰。
- #爬虫模块
- 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+=1
复制代码 第四步:执行程序
利用ThreadPoolExecutor函数,开五个线程同时爬取网页图片
- if __name__ == '__main__':
- #创建url列表
- url_list = create_urls()
- #使用多线程爬取网页数据
- with ThreadPoolExecutor(5) as t:
- for url in url_list:
- t.submit(spider(url))
复制代码 最后是网页源代码
- 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():
- url_list =[]
- url = 'https://www.bizhi888.com/e/sch/index.php?page=0&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
- #共计120页图片
- for page in range(10,120):
- url = f'https://www.bizhi888.com/e/sch/index.php?page={page}&keyboard=%E7%BE%8E%E5%A5%B3&field=2&sear=1'
- url_list.append(url)
- 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__':
- #创建url列表
- url_list = create_urls()
- #使用多线程爬取网页数据
- with ThreadPoolExecutor(5) as t:
- for url in url_list:
- t.submit(spider(url))
复制代码 下面让我们看结果
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |