蜂鸟网图片--简介

今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度。

安装模块常规套路

pip install aiohttp

运行之后等待,安装完毕,想要深造,那么官方文档必备 :https://aiohttp.readthedocs.io/en/stable/

接下来就可以开始写代码了。

我们要爬取的页面,这一次选取的是

http://bbs.fengniao.com/forum/forum_101_1_lastpost.html

打开页面,我们很容易就获取到了页码


好久没有这么方便的看到页码了。


尝试用 aiohttp 访问这个页面吧,模块的引入,没有什么特殊的,采用 import 即可
如果我们需要 使用Asyncio + Aiohttp异步IO 编写爬虫,那么需要注意,你需要异步的方法前面加上async

接下来,先尝试去获取一下上面那个地址的网页源码。

代码中,先声明一个fetch_img_url的函数,同时携带一个参数,这个参数也可以直接写死。

with 上下文不在提示,自行搜索相关资料即可 (`・ω・´)

aiohttp.ClientSession() as session: 创建一个session对象,然后用该session对象去打开网页。session可以进行多项操作,比如postgetput

代码中 await response.text() 等待网页数据返回

asyncio.get_event_loop创建线程,run_until_complete方法负责安排执行 tasks中的任务。tasks可以为单独的函数,也可以是列表。

import aiohttp
import asyncio async def fetch_img_url(num):url = f'http://bbs.fengniao.com/forum/forum_101_{num}_lastpost.html'  # 字符串拼接# 或者直接写成 url = 'http://bbs.fengniao.com/forum/forum_101_1_lastpost.html'print(url)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400',}async with aiohttp.ClientSession() as session:# 获取轮播图地址async with session.get(url,headers=headers) as response:try:html = await response.text()   # 获取到网页源码print(html)except Exception as e:print("基本错误")print(e)# 这部分你可以直接临摹
loop = asyncio.get_event_loop()
tasks = asyncio.ensure_future(fetch_img_url(1))
results = loop.run_until_complete(tasks)

上面代码最后一部分也可以写成

loop = asyncio.get_event_loop()
tasks =  [fetch_img_url(1)]
results = loop.run_until_complete(asyncio.wait(tasks))

好了,如果你已经成果的获取到了源码,那么距离最终的目的就差那么一丢丢了。
修改代码为批量获取10页。
只需要修改tasks即可,在此运行,看到如下结果

tasks =  [fetch_img_url(num) for num in range(1, 10)]

下面的一系列操作和上一篇博客非常类似,找规律。
随便打开一个页面

http://bbs.fengniao.com/forum/forum_101_4_lastpost.html

点击一张图片,进入内页,在点击内页的一张图片,进入到一个轮播页面

再次点击进入图片播放页面

最后我们在图片播放页面,找到源码中发现了所有的图片链接,那么问题出来了,如何从上面的第一个链接,转变成轮播图的链接???
下面的源码是在 http://bbs.fengniao.com/forum/pic/slide_101_10408464_89383854.html 右键查看源码。

继续分析吧~~~~ ヾ(=・ω・=)o

http://bbs.fengniao.com/forum/forum_101_4_lastpost.html
转变成下面的链接?
http://bbs.fengniao.com/forum/pic/slide_101_10408464_89383854.html

继续看第一个链接,我们使用F12开发者工具,去抓取一个图片看看。

图片中标黄色框的位置,发现了我们想要的数字,那么好了,我们只需要通过正则表达式把他们匹配出来就好了。
代码在下面####的位置,需要注意的是,我采用的原始的正则匹配,在编写正则表达式的过程中,我发现一步竟然没有完整匹配,只能分成两个步骤了,你可以看一下具体的细节o(╥﹏╥)o

  1. 查找所有的图片<div class="picList">
  2. 获取我们想要的两部分数字
async def fetch_img_url(num):url = f'http://bbs.fengniao.com/forum/forum_101_{num}_lastpost.html'print(url)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6726.400 QQBrowser/10.2.2265.400',}async with aiohttp.ClientSession() as session:# 获取轮播图地址async with session.get(url,headers=headers) as response:try:###############################################url_format = "http://bbs.fengniao.com/forum/pic/slide_101_{0}_{1}.html"html = await response.text()   # 获取到网页源码pattern = re.compile('<div class="picList">([\s\S.]*?)</div>')first_match = pattern.findall(html)href_pattern = re.compile('href="/forum/(\d+?)_p(\d+?)\.html')urls = [url_format.format(href_pattern.search(url).group(1), href_pattern.search(url).group(2)) for url in first_match]##############################################except Exception as e:print("基本错误")print(e)

代码完成,我们已经获取到,我们想要的URL了,下面继续读取URL内部信息,然后匹配我们想要的图片链接

async def fetch_img_url(num):# 去抄上面的代码
    async with aiohttp.ClientSession() as session:# 获取轮播图地址async with session.get(url,headers=headers) as response:try:#去抄上面的代码去吧################################################################for img_slider in urls:try:async with session.get(img_slider, headers=headers) as slider:slider_html = await slider.text()   # 获取到网页源码try:pic_list_pattern = re.compile('var picList = \[(.*)?\];')pic_list = "[{}]".format(pic_list_pattern.search(slider_html).group(1))pic_json = json.loads(pic_list)  # 图片列表已经拿到print(pic_json)except Exception as e:print("代码调试错误")print(pic_list)print("*"*100)print(e)except Exception as e:print("获取图片列表错误")print(img_slider)print(e)continue################################################################print("{}已经操作完毕".format(url))except Exception as e:print("基本错误")print(e)

图片最终的JSON已经拿到,最后一步,下载图片,当当当~~~~,一顿迅猛的操作之后,图片就拿下来了

async def fetch_img_url(num):# 代码去上面找
    async with aiohttp.ClientSession() as session:# 获取轮播图地址async with session.get(url,headers=headers) as response:try:# 代码去上面找for img_slider in urls:try:async with session.get(img_slider, headers=headers) as slider:# 代码去上面找##########################################################for img in pic_json:try:img = img["downloadPic"]async with session.get(img, headers=headers) as img_res:imgcode = await img_res.read()  # 图片读取with open("images/{}".format(img.split('/')[-1]), 'wb') as f:f.write(imgcode)f.close()except Exception as e:print("图片下载错误")print(e)continue###############################################################except Exception as e:print("获取图片列表错误")print(img_slider)print(e)continueprint("{}已经操作完毕".format(url))except Exception as e:print("基本错误")print(e)

图片会在你提前写好的images文件夹里面快速的生成

tasks最多可以开1024协程,但是建议你开100个就OK了,太多并发,人家服务器吃不消。

以上操作执行完毕,在添加一些细节,比如保存到指定文件夹,就OK了。

转载于:https://www.cnblogs.com/qingdeng123/p/10808991.html

Python爬虫入门教程第七讲: 蜂鸟网图片爬取之二相关推荐

  1. Python爬虫入门【7】: 蜂鸟网图片爬取之二

    蜂鸟网图片–简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度. 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文档 ...

  2. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  3. Python爬虫入门教程 3-100 美空网数据爬取 1

    1.美空网数据-简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...

  4. Python爬虫入门教程 14-100 All IT eBooks多线程爬取

    All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着 ...

  5. Python爬虫入门教程 3-100 美空网数据爬取

    1.美空网数据-简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...

  6. python爬虫知乎图片_Python爬虫入门教程 25-100 知乎文章图片爬取器之一

    1. 知乎文章图片爬取器之一写在前面 今天开始尝试爬取一下知乎,看一下这个网站都有什么好玩的内容可以爬取到,可能断断续续会写几篇文章,今天首先爬取最简单的,单一文章的所有回答,爬取这个没有什么难度. ...

  7. Python爬虫入门教程18:好看视频的爬取

    前言

  8. python爬图片代码大全_爬虫入门教程⑩— 用漂亮的图表展示爬取到的数据

    经过了前面的努力,我们成功获取到了数据,并且学会了保存,但是只是用网页展示出来,是不是有一些不够美观呢? 所以本节的内容是:数据的可视化.拿到了数据却不能使其简单易懂并且足够突出,那就是不是好的数据工 ...

  9. Python爬虫入门教程石家庄链家租房数据抓取

    1. 写在前面 这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材. 我们需要爬取的网址为:https://sjz.lianjia.com/zufang/ 2. 分析 ...

  10. Python爬虫入门(四):实战,爬取4399小游戏首页

    目录 robots.txt robots协议 robots.txt 语法 君子协定 何时需要robots协议? 查看4399.com的robots.txt 设定并分析目标 代码 urllib2& ...

最新文章

  1. 这代码水平,连 Bug 王都甘拜下风 | 每日趣闻
  2. .NET完全手动搭建三层B/S架构
  3. xenapp5 负载均衡配置
  4. RS-232/E1协议转换器产品介绍
  5. DataReader对象的基本使用 c#
  6. 基于WF4的新平台-流程模式-(9)表单路由启动传入
  7. iphone分屏功能怎么用_iPhone终于上线这功能,可惜安卓都用烂了
  8. springmvc的运行流程
  9. vivo S10系列正式发布 引领“自然美”自拍潮流
  10. 使用MATLAB分析处理csv数据
  11. 使用Kotlin的Android ProgressBar
  12. spss无法连接到本地计算机,有关IBM SPSS Statistics无法打开的几个原因,附带解决方法...
  13. DOS命令行使用pscp实现远程文件和文件夹传输(转)
  14. 我的团长我的团第十七集
  15. 油价上涨后,「两轮电动车」还是没有找到正确的出路?
  16. 董明珠揭示:未来2年这个行业盈利最大,马总点赞说,又要出富翁
  17. 小程序入门(1)-项目环境搭建
  18. 绝地求生——PUBG吃鸡游戏模糊,画质很差
  19. 通达信波段顶底指标公式,抓到真正顶底并且绝对精准可能吗?
  20. 魔兽世界怀旧服2020年最新服务器列表,2020年2月15日魔兽世界怀旧服服务器的排队等待时间的真实数据...

热门文章

  1. NAT技术及NAT ALG
  2. ARP报文目的MAC为什么不是广播地址?
  3. 【雕爷学编程】Arduino动手做(108)---GY-521三轴模块
  4. Aho-Corasick(AC自动机)
  5. 人工智能应用计算机的实例,人工智能应用实例介绍
  6. discuz 风格模板制作
  7. 关于全国信息安全作品赛的了解
  8. react 复制antd表格行
  9. 这些屏幕特效是咋实现的
  10. 如何将c语言程序变成应用,C语言代码转换为应用程序