Python爬虫入门教程【7】: 蜂鸟网图片爬取之二
蜂鸟网图片–简介
今天玩点新鲜的,使用一个新库 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
可以进行多项操作,比如post
, get
, put
等
代码中 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)
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
上面代码最后一部分也可以写成
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
- 查找所有的图片
<div class="picList">
- 获取我们想要的两部分数字
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)
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
代码完成,我们已经获取到,我们想要的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)
Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
图片会在你提前写好的images
文件夹里面快速的生成
tasks
最多可以开1024协程,但是建议你开100个就OK了,太多并发,人家服务器吃不消。
以上操作执行完毕,在添加一些细节,比如保存到指定文件夹,就OK了。
Python爬虫入门教程【7】: 蜂鸟网图片爬取之二相关推荐
- Python爬虫入门教程 6-100 蜂鸟网图片爬取之一
1. 蜂鸟网图片简介 国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习,不要 ...
- Python爬虫入门教程02:小说爬取
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文 01.python爬虫入门教程01:豆瓣Top电影爬取 基本开发环境 Python 3 ...
- python爬虫爬图片教程_Python爬虫入门教程 5-100 27270图片爬取
获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥 ...
- Python爬虫入门教程09:多线程爬取表情包图片
前言
- python爬虫入门实战---------一周天气预报爬取_Python爬虫入门实战--------一周天气预报爬取【转载】【没有分析...
Python爬虫入门实战--------一周天气预报爬取[转载][没有分析 Python爬虫入门实战--------一周天气预报爬取[转载][没有分析] 来源:https://blog.csdn.ne ...
- python爬虫入门教程--优雅的HTTP库requests(二)
requests 实现了 HTTP 协议中绝大部分功能,它提供的功能包括 Keep-Alive.连接池.Cookie持久化.内容自动解压.HTTP代理.SSL认证等很多特性,下面这篇文章主要给大家介绍 ...
- python爬虫之使用requests进行图片爬取
前期回顾,关于python基础知识以及爬虫基础我们可以看 --> python学习手册,网络安全的小伙伴千万不要错过. 图片爬取思路 学会这一技能需要我们会python基础,xpath解析,其用 ...
- Python爬虫学习教程 bilibili网站视频爬取!【附源码】
Python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...
- Python爬虫入门【7】: 蜂鸟网图片爬取之二
蜂鸟网图片–简介 今天玩点新鲜的,使用一个新库 aiohttp ,利用它提高咱爬虫的爬取速度. 安装模块常规套路 pip install aiohttp 运行之后等待,安装完毕,想要深造,那么官方文档 ...
- Python爬虫入门案例教学:批量爬取彼岸桌面4K超清美女壁纸
先图片开路 环境介绍 python 3.6 / 3.8 pycharm 编辑器 requests parsel os 文件操作 在cmd里面就可以进行安装 pip install requests 无 ...
最新文章
- php 接口的定义与实现,PHP接口定义与用法示例
- 美国进入紧急状态:谷歌投入1700名工程师上阵抗疫,马斯克称车祸比新冠病毒危险...
- [Oracle]构筑TDE 环境的例子
- Python re 模块中,如何使用反斜杠 “\“分割字符串?
- Nginx教程系列三:Nginx常用命令
- JS获取html页面上选中内容
- 一个人的旅行(HDU-2066)
- Calypso - Android和Evolution下的CalDAV/CardDAV/Web...
- linux驱动编写(字符设备编写框架)
- mysql 等于_mysql 不等于 符号写法
- top -bcn -1
- apache ab测试与centos系统优化
- c语言2048代码linux,C语言2048小游戏课设(附源码).doc
- 多功能图片处理器微信小程序源码下载一键多种处理照片
- 排水管网计算机模拟,基于SWMM的城市合流制排水管网计算机模拟方法.ppt
- Android之adb安装apk
- 深度学习调参经验分享(遥感建筑提取)
- Bootstrap Table Fixed Columns
- 设置Mac的输入法切换快捷键
- VSS2005的配置