1. 蜂鸟网图片-简介

今天玩点新鲜的,使用一个新库 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)

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

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了,太多并发,人家服务器吃不消。

更多资源,欢迎关注公众号:非本科程序员,搜索htmlhttp就可以找到啦

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

Python爬虫入门教程 7-100 蜂鸟网图片爬取之二 1相关推荐

  1. python爬虫教程下载-Python爬虫入门教程!手把手教会你爬取网页数据

    其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据.这里的"技术手段"就是网络爬虫.今天就给大家分享一篇爬虫基础知识 ...

  2. python爬虫入门教程04:招聘信息爬取

    前言

  3. Python爬虫入门教程10:彼岸壁纸爬取

    基本开发环境

  4. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

  5. python爬虫教材推荐 豆瓣_Python爬虫入门教程:豆瓣Top电影爬取

    基本开发环境Python 3.6 Pycharm 相关模块的使用requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一.明确需求 爬 ...

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

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

  7. python二手房使用教程_Python爬虫入门教程03:二手房数据爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本开发环境Python 3.6 Pycharm 相关模块的使用requests parse ...

  8. python爬虫入门 之 移动端数据的爬取

    第七章 移动端数据的爬取 基于某一款抓包工具 : fiddler ,青花瓷 ,miteproxy 7.1 fiddler 基本配置 7.1.1fiddler简介和安装 什么是Fiddler? Fidd ...

  9. Python爬虫入门实例九之Scrapy框架爬取股票信息(亲测有效)

    文章目录 写在前面 一.准备工作 二.具体步骤 1.建立工程和Spider模板 2.编写Spider 3.编写pipelines 4.更改settings 5.运行爬虫 三.注意事项 1.文件内容为空 ...

  10. Python爬虫入门教程 16-100 500px摄影师社区抓取摄影师数据

    1. 500px摄影师社区-写在前面 今天要抓取的网站为 https://500px.me/ ,这是一个摄影社区,在一个摄影社区里面本来应该爬取的是图片信息,可是我发现好像也没啥有意思的,忽然觉得爬取 ...

最新文章

  1. foreach对集合的输出作用
  2. pomelo php,Nginx 502 Bad Gateway 自动重启shell脚本
  3. FindBugs和JSR-305
  4. 【bzoj3576】 Hnoi2014—江南乐
  5. 黑客攻防技术宝典Web实战篇第2版—第4章 解析应用程序
  6. CRT链接ubuntu报错The remote system refused the connection
  7. Matlab的语言概述
  8. java手机号正则校验工具类
  9. cmake 下载和安装
  10. 网线制作实验相关内容
  11. 【数据结构】leetcode707:python实现链表设计;leetcode142:环形链表
  12. 成都软考-技术技能提升补贴领取指南
  13. 工业机器人常用的六种坐标系
  14. 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式
  15. Warning: Failed prop type: Invalid prop `enablesReturnKeyAutomatically` of type `string` supplie
  16. CANOE使用三:不用diva也能自动化测试UDS(创建TestModule-搭配Panel界面及使用Capl识别配置文件TXT编写基于14229的UDS自动化测试流程)
  17. Rokid从音箱产品到行业赋能:四年谋局,一鸣惊人
  18. 中国类脑计算先行者:在AI“无人区”探路
  19. php 根据经纬度获取附近50km的信息,并计算距离
  20. 敏捷实践不可忽略的环节

热门文章

  1. HiKey试用体验 烧写系统至Flash之诡异事件
  2. 【补遗】- OC学习小窍门及文件操作(归档)
  3. Unity 3D 如何获取鼠标移动事件
  4. 浅谈认识商业智能过程中遇到的困难
  5. 云计算第二天总结 10.29
  6. 考研数学笔记(更新中)
  7. Ribbon饥饿加载
  8. 草根学Python(七) 迭代器和生成器
  9. 华为“最青睐”的10所大学,有你的大学么?
  10. python绘制奥运五环