Python爬虫入门教程 13-100 斗图啦表情包多线程爬取
程序员文章站
2023-12-23 20:37:51
写在前面 今天在CSDN博客,发现好多人写爬虫都在爬取一个叫做 的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的。关键技术点 ,你可以看一下我前面的文章,然后在学习一下。 网站就不分析了,无非就是找到规律,拼接URL,匹配关键点,然后爬取。 撸代码 首先快速的导入 ......
写在前面
今天在csdn博客,发现好多人写爬虫都在爬取一个叫做斗图啦
的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的。关键技术点 aiohttp
,你可以看一下我前面的文章,然后在学习一下。
网站就不分析了,无非就是找到规律,拼接url,匹配关键点,然后爬取。
撸代码
首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在了同一个文件夹下面,所以需要导入os
模块
import asyncio import aiohttp from lxml import etree import os
编写主要的入口方法
if __name__ == '__main__': url_format = "http://www.doutula.com/article/list/?page={}" urls = [url_format.format(index) for index in range(1,586)] loop = asyncio.get_event_loop() tasks = [x_get_face(url) for url in urls] results = loop.run_until_complete(asyncio.wait(tasks))
我们是为了学习,不是为了攻击别人服务器,所以限制一下并发数量
sema = asyncio.semaphore(3) async def x_get_face(url): with(await sema): await get_face(url)
最后,一顿操作猛如虎,把所有的代码补全,就搞定了,这部分没有什么特别新鲜的地方,找图片链接,然后下载。
headers = {"user-agent": "mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/68.0.3440.106 safari/537.36"} async def get_face(url): print("正在操作{}".format(url)) async with aiohttp.clientsession() as s: async with s.get(url,headers=headers,timeout=5) as res: if res.status==200: html = await res.text() html_format = etree.html(html) hrefs = html_format.xpath("//a[@class='list-group-item random_list']") for link in hrefs: url = link.get("href") title = link.xpath("div[@class='random_title']/text()")[0] # 获取文件头部 path = './biaoqings/{}'.format(title.strip()) # 硬编码了,你要先在项目根目录创建一个biaoqings的文件夹 if not os.path.exists(path): os.mkdir(path) else: pass async with s.get(url, headers=headers, timeout=3) as res: if res.status == 200: new_html = await res.text() new_html_format = etree.html(new_html) imgs = new_html_format.xpath("//div[@class='artile_des']") for img in imgs: try: img = img.xpath("table//img")[0] img_down_url = img.get("src") img_title = img.get("alt") except exception as e: print(e) async with s.get(img_down_url, timeout=3) as res: img_data = await res.read() try: with open("{}/{}.{}".format(path,img_title.replace('\r\n',""),img_down_url.split('.')[-1]),"wb+") as file: file.write(img_data) except exception as e: print(e) else: pass else: print("网页访问失败")
等着,大量的表情包就来到了我的碗里。