我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python爬虫入门教程 7-100 蜂

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python爬虫入门教程 7-100 蜂

蜂鸟网图片--简介

今天玩点新鲜的,使用一个新库 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)
                        continue
                print("{}已经操作完毕".format(url))
            except Exception as e:
                print("基本错误")
                print(e)

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

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

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

github代码地址

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python爬虫入门教程 7-100 蜂

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python爬虫入门教程 7-100 蜂

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

Python爬虫入门教程 8-100 蜂

蜂鸟网图片--啰嗦两句前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用aiohttp 希望你喜欢爬取页面https://tu.fengniao.com/15/ 本篇教程还是基于学习的目的,为啥选择蜂鸟,没办法,我瞎
2023-01-30

Python爬虫入门教程 6-100 蜂

1. 蜂鸟网图片--简介国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习,不要用于商业目的,不出意外,蜂鸟是有版权保
2023-01-30

Python爬虫入门教程 15-100

石家庄政民互动数据爬取-写在前面今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的。网址为http://www.sjz.gov.cn/col/1490066682000/index.html首先声
2023-01-30

Python爬虫入门教程 19-100

从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院,CSDN学院,网易云课堂,慕课网等平台,数据统一抓取到mongodb里面,如果对上
2023-01-30

Python爬虫入门教程 29-100

1. 手机APP数据----写在前面继续练习pyspider的使用,最近搜索了一些这个框架的一些使用技巧,发现文档竟然挺难理解的,不过使用起来暂时没有障碍,估摸着,要在写个5篇左右关于这个框架的教程。今天教程中增加了图片的处理,你可以重点学
2023-01-30

Python爬虫入门教程 32-100

1. B站博人传评论数据爬取简介今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看。网址: https://www.bilibil
2023-01-30

Python爬虫入门教程 38-100

爬前叨叨今天要爬取一下正规大学名单,这些名单是教育部公布具有招生资格的高校名单,除了这些学校以外,其他招生的单位,其所招学生的学籍、发放的毕业证书国家均不予承认,也就是俗称的野鸡大学!网址是 https://daxue.eol.cn/min
2023-01-30

Python爬虫入门教程 59-100

图片比对昨天的博客已经将图片存储到了本地,今天要做的第一件事情,就是需要在两张图片中进行比对,将图片缺口定位出来缺口图片完整图片计算缺口坐标对比两张图片的所有RBG像素点,得到不一样像素点的x值,即要移动的距离 def get_dis
2023-01-31

Python爬虫入门教程 61-100

python3爬虫遇到了反爬当你兴冲冲的打开一个网页,发现里面的资源好棒,能批量下载就好了,然后感谢写个爬虫down一下,结果,一顿操作之后,发现网站竟然有反爬措施,尴尬了。接下来的几篇文章,我们研究一下各种反爬虫套路,当然互联网没有100
2023-01-31

Python爬虫入门教程 10-100

图虫网-写在前面经历了一顿噼里啪啦的操作之后,终于我把博客写到了第10篇,后面,慢慢的会涉及到更多的爬虫模块,有人问scrapy 啥时候开始用,这个我预计要在30篇以后了吧,后面的套路依旧慢节奏的,所以莫着急了,100篇呢,预计4~5个月写
2023-01-30

Python爬虫入门教程 18-100

很高兴我这系列的文章写道第18篇了,今天写一个爬虫爱好者特别喜欢的网站煎蛋网http://jandan.net/ooxx,这个网站其实还是有点意思的,网站很多人写了N多的教程了,各种方式的都有,当然网站本身在爬虫爱好者的不断进攻下,也在不断
2023-01-30

Python爬虫入门教程 20-100

美好的一天又开始了,今天咱继续爬取IT在线教育类网站,慕课网,这个平台的数据量并不是很多,所以爬取起来还是比较简单的打开我们要爬取的页面,寻找分页点和查看是否是异步加载的数据。进行了一些相应的分析,发现并没有异步数据,只需要模拟翻页就,在进
2023-01-30

Python爬虫入门教程 36-100

爬前叨叨2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我打算在50篇博客之后在写,所以现在就放一放
2023-01-30

Python爬虫入门教程 46-100

1. 手机收音机-爬前叨叨今天选了一下,咱盘哪个APP呢,原计划是弄荔枝APP,结果发现竟然没有抓到数据,很遗憾,只能找个没那么圆润的了。搜了一下,找到一个手机收音机 下载量也是不错的。2. 爬虫套路爬虫基本套路抓包获取链接分析数据抓数据使
2023-01-30

Python爬虫入门教程 37-100

爬前叨叨2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒数据分析官方网址为 https://www.clouderwork.com/进入全部项目列表页面,很容易分辨出
2023-01-30

Python爬虫入门教程 45-100

1. Charles抓取兔儿故事背景介绍之前已经安装了Charles,接下来我将用两篇博客简单写一下关于Charles的使用,今天抓取一下兔儿故事里面关于小猪佩奇的故事。爬虫编写起来核心的重点是分析到链接,只要把链接分析到,剩下的就好办了。
2023-01-30

Python爬虫入门教程 55-100

验证码探究如果你是一个数据挖掘爱好者,那么验证码是你避免不过去的一个天坑,和各种验证码斗争,必然是你成长的一条道路,接下来的几篇文章,我会尽量的找到各种验证码,并且去尝试解决掉它,中间有些技术甚至我都没有见过,来吧,一起Coding吧数字+
2023-01-31

Python爬虫入门教程 57-100

滑动验证码介绍本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成。这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/cap
2023-01-31

Python爬虫入门教程 40-100

爬前叨叨第40篇博客吹响号角,爬取博客园博客~本文最终抓取到了从2010年1月1日到2019年1月7日的37W+文章,后面可以分析好多东西了呢经常看博客的同志知道,博客园每个栏目下面有200页,多了的数据他就不显示了,最多显示4000篇博客
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录