最原始的方式以二进制写入文件保存图片

import re
import os
import requestsclass BsbdqjSpider:def __init__(self):self.base_url = "http://www.budejie.com/"self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}self.parttern = re.compile(r'<div class="j-r-list-c-img">[\w\W]*?<img src="(.+?)"[\w\W]*?title="(.*?)"')self.parttern_type = re.compile(r".*?(\..{3})$")def parse_url(self, url):response = requests.get(url, headers=self.headers)response_data = response.content.decode()return self.parttern.findall(response_data)def save_content_list(self, response_list):for x in response_list:url, title = xtitle = title.replace("?", "!")type = self.parttern_type.search(url).group(1)with open(title + type, "wb") as f:f.write(requests.get(url,headers=self.headers).content)f.flush()def run(self):response_list = self.parse_url(self.base_url + "1")self.save_content_list(response_list)if __name__ == "__main__":bsbdqj_spider = BsbdqjSpider()bsbdqj_spider.run()

使用urllib模块中的urlretrieve下载图片

import re
import os
import requests
from urllib import request
from lxml import etree
import gevent
from gevent import monkey
from retrying import retrymonkey.patch_socket()class BsbdqjSpider:def __init__(self):self.base_url = "http://www.budejie.com/"self.headers = {"Upgrade - Insecure - Requests": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}self.parttern = re.compile(r'<div class="j-r-list-c-img">[\w\W]*?data-original="(.+?)"[\w\W]*?title="(.*?)"')self.parttern_type = re.compile(r".*?(\..{3})$")self.path = "./bsbdqj/"self.islast = Falsedef mkdir(self):if not os.path.exists(self.path):os.mkdir(self.path)def parse_url(self, url):response = requests.get(url, headers=self.headers)response_data = response.content.decode()# selector = etree.HTML(response_data)# try:#     selector.xpath(r"//div[@class='m-page m-page-sr m-page-sm']/i")# except:#     self.islast = Truereturn self.parttern.findall(response_data)def save_content_list(self, response_list):for x in response_list:url, title = xtitle = title.replace("?", "!")[:20]type = self.parttern_type.search(url).group(1)self.save_urlretrieve(url, self.path + title + type)def save_urlretrieve(self, url, name):request.urlretrieve(url, name)def _run(self, page):response_list = self.parse_url(self.base_url + str(page))self.save_content_list(response_list)def run(self):self.mkdir()gevent.joinall([gevent.spawn(self._run, i) for i in range(1, 51)])if __name__ == "__main__":bsbdqj_spider = BsbdqjSpider()bsbdqj_spider.run()

这种大量IO操作的程序并不适合协程,使用多线程速度提升了几十倍,也可能是我协程写的太烂了。

import re
import os
import requests
from urllib import request
from lxml import etreefrom retrying import retry
from queue import Queue
import threadingclass BsbdqjSpider:def __init__(self):self.base_url = "http://www.budejie.com/"self.headers = {"Upgrade - Insecure - Requests": "1","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}self.parttern = re.compile(r'<div class="j-r-list-c-img">[\w\W]*?data-original="(.+?)"[\w\W]*?title="(.*?)"')self.parttern_type = re.compile(r".*?(\..{3})$")self.path = "./bsbdqj_threading/"self.url_queue = Queue()self.content_queue = Queue()self.down_queue = Queue()def mkdir(self):if not os.path.exists(self.path):os.mkdir(self.path)def parse_url(self):while True:url = self.url_queue.get()response = requests.get(url, headers=self.headers)response_data = response.content.decode()self.content_queue.put(self.parttern.findall(response_data))selector = etree.HTML(response_data)is_more = selector.xpath(r"//div[@class='m-page m-page-sr m-page-sm']/i/text()")if len(is_more):page = re.search(r"\d+?$", url).group()self.url_queue.put(self.base_url + str(int(page) + 1))self.url_queue.task_done()def save_content_list(self):while True:response_list = self.content_queue.get()print(response_list)for x in response_list:url, title = xtitle = title.replace("?", "!")[:20]type = self.parttern_type.search(url).group(1)self.down_queue.put((url, self.path + title + type))self.content_queue.task_done()def save_urlretrieve(self):while True:url, name = self.down_queue.get()try:request.urlretrieve(url, name)except:passself.down_queue.task_done()@retry(stop_max_attempt_number=3)def _save_urlretrieve(self, url, name):request.urlretrieve(url, name)def run(self):self.mkdir()thread_list = []self.url_queue.put(self.base_url + "1")parse_url = threading.Thread(target=self.parse_url)thread_list.append(parse_url)for i in range(5):t_save_news = threading.Thread(target=self.save_content_list)thread_list.append(t_save_news)for i in range(10):t_down_photo = threading.Thread(target=self.save_urlretrieve)thread_list.append(t_down_photo)for t in thread_list:t.setDaemon(True)#把子线程设置为守护线程,该线程不重要.主线程结束,子线程结束t.start()for q in [self.url_queue, self.content_queue, self.down_queue]:q.join()  # 让主线程等待阻,塞,等待队列的任务完成之后再完成if __name__ == "__main__":bsbdqj_spider = BsbdqjSpider()bsbdqj_spider.run()

requests爬取图片(百思不得其姐)相关推荐

  1. 【Python爬虫系列】使用requests爬取图片

    Python3常用的爬虫第三方插件有requests,urllib.request等.这里主要介绍使用requests抓取网页上的图片,该方法只针对静态网页,不考虑js动态加载的网页. 预备知识: r ...

  2. Python requests爬取图片

    练习requests爬虫 保存图片时,文件夹实现去重,图片暂没有去重 import requests from bs4 import BeautifulSoup import re import os ...

  3. python爬取图片的库_16-python爬虫之Requests库爬取海量图片

    Requests 是一个 Python 的 HTTP 客户端库. Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和P ...

  4. 图片的批量下载 和 爬虫爬取图片数据集

    图片的批量下载 和 爬虫爬取图片数据集 1.图片的批量下载 1.图片的批量下载 数据集是深度学习的一切,没有数据集它什么也不是,现在你知道数据集很重要了吧 代码: ''' 项目名称:爬取公章数据 创建 ...

  5. 孤荷凌寒自学python第八十一天学习爬取图片1

    孤荷凌寒自学python第八十一天学习爬取图片1 (完整学习过程屏幕记录视频地址在文末) 通过前面十天的学习,我已经基本了解了通过requests模块来与网站服务器进行交互的方法,也知道了Beauti ...

  6. python输入数据爬取_python根据用户需求输入想爬取的内容及页数爬取图片方法详解...

    本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数. 主要步骤: 1.提示用户输入爬取的内容及页码. 2.根据用户输入,获取网址列表. 3.模拟浏览器向服务器发送请求,获取响应. 4.利用xp ...

  7. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片

    python爬虫 asyncio aiohttp aiofiles 多任务异步协程爬取图片 main.py """=== coding: UTF8 ==="&q ...

  8. 快看,这是我为你准备的Python爬取图片教程

    爬取图片实例 •selenium+win32爬取图片 Python学习交流Q群:903971231##### """爬取图片""" impo ...

  9. 爬取图片,并按比例划分数据集

    爬取图片,并按比例划分数据集 上课老师布置的作业,做完保存下来. (1)批量爬取不同的10个明星的图片各100张: (2)每个明星的图片放一个文件夹,并按"name_###.jpg" ...

  10. python怎么批量爬取图片_python批量爬取网络图片

    上篇通过python爬取了一篇网络小说,初步了解了爬虫的四步流程,本文稍微扩展一点,试着从网页中爬取出多个图片,具体来看看: 我们今天试着从下面图1的网页上将所有图片都爬取出来,放在一个指定的文件夹里 ...

最新文章

  1. 1分钟构建API网关日志解决方案
  2. Temporary ASP.Net Files探究
  3. RediSQL 0.8.0 发布,将查询结果写入流中
  4. @你 ,这是一个会改变你的 2019 的神奇礼物,真好!
  5. redis的bigkeys命令之原理
  6. 有关UITableView--cell复用问题
  7. Ubuntu下qt5无法输入中文
  8. spss回归分析_SPSS之回归分析
  9. python 使用异常代替返回状态码
  10. paip.提升用户体验---提高兼容性无JS支持总结
  11. 好文推荐(二):临界点-产品思维与设计思维(7)
  12. Google SketchUp Cookbook: (Chapter 3) Intersection Edges: Cutting and Trimming
  13. win10家庭版调出组策略(gpedit.msc)要求的函数不受支持
  14. 性别计算机英语怎么说,性别教育用英语怎么说?
  15. 艺赛旗(RPA)RPA8.0 解决滑动验证码完整流程
  16. 菜鸟教程 + Java基础课程 + part2
  17. 全球与中国医疗计费软件市场深度研究分析报告
  18. 啵哩打印机如何连电脑打印(转载)
  19. Eureka 的 Application Service 客户端的注册以及运行示例
  20. 使c语言程序变成流程图的软件,c语言流程图生成器

热门文章

  1. 苹果手机换电池对手机有影响吗_电池寿命真的影响手机性能~iPhone手机更换电池后性能对比...
  2. 交互式电子白板android,交互式电子白板教学应用
  3. 黑马程序员_java语言基础_概述
  4. 蓝桥杯 java 跳马问题
  5. 元图地图开放平台系统概述
  6. 电子宠物游戏(附C++源码)
  7. 高德视觉技术中心招聘计算机视觉研发(社招/校招/实习岗位)
  8. 题解 CF1389B 【Array Walk】
  9. QNX Hypervisor —— 虚拟设备
  10. http-equiv属性详解