Python爬取百度图库

页面分析

通过Chrome 的开发者模式,我们可以很发现 百度图库是通过ajax 加载图片的。 每一次都会发送一个请求:https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E6%BC%86%E9%BB%91%E7%9A%84%E5%AD%90%E5%BC%B9%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E6%BC%86%E9%BB%91%E7%9A%84%E5%AD%90%E5%BC%B9%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=30&rn=30&gsm=1e&1521558249171= 以我搜索的内容为例 这坨很长的url 就是我们需要的 内容。里面以json格式保存的图片数据

那么这坨url是如何构建的呢?

多次对比url 可以发现 有几个参数是改变的&pn= &1521558249171 queryWord 和word 都是指搜索内容

其他的参数都是固定的QAQ 也就是我们在弄懂 pn 和 一串神奇的数字 是什么就成功了一半了

pn : 当前页数 * 30

神奇数字: 当前时间的时间戳取到小数点后3位

gsm:pn 的 16位显示

代码编写

我是使用的python3.6版本

先简单说下写代码的思路:

  • 先进行拼接url–> 就是含有图片数据的json
  • 根据url进行请求 拿到html
  • 拿到结果进行取具体数据
  • 将数据写入本地

为了提高速度: 使用ThreadPoolExecutor 维护了 10个线程

emmm 然后。。。没有然后了

代码

from urllib.parse import urlencode
import time
import random
import requests
import simplejson as json
from concurrent.futures import ThreadPoolExecutor as Pool
class Crawler:"""爬虫类"""def __init__(self, BATH_DIR=r'E:\Demo\baidu_img', thread=10, height=None, width=None):"""初始化入口URL可设置BATH_DIR 图片存储路径 默认测试路径thread 线程池维护的线程数量 默认是10个height 图片高度width 图片宽度"""self.user_agent = ['Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)\AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50','Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)\AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50',]self.headers = {'User-Agent': self.user_agent[0] if random.randrange(0, 10) % 2 == 0 else self.user_agent[1],}self.base_url = 'https://image.baidu.com/search/acjson?'self.end_page = Noneself.world = Noneself.err_list = []self.BATH_DIR = BATH_DIRself.theadings = threadself.height = heightself.width = widthdef get_json_url(self, page=1):"""获取json的数据包的URL"""s_time = time.time()s_time = ''.join('{:.3f}'.format(s_time).split('.'))pn = page * 30gsm = hex(pn)data = {'tn': 'resultjson_com','ipn': 'rj','ct': '201326592','is': '','fp': 'result','queryWord': self.world,'cl': '2','lm': '-1','ie': 'utf-8','oe': 'utf-8','adpicid':'','st': '-1','z': '','ic': '0','word': self.world,'s': '','se': '','tab': '','width': '','height': '','face': '0','istype': '2','qc': '','nc': '1','fr': '','pn': pn,'rn': '30','gsm': gsm,'e': '',s_time: '',}url = self.base_url + urlencode(data)return urldef get_json(self, page=1):"""请求json获取包含图片的包"""url = self.get_json_url(page)time.sleep(1)response = requests.get(url, headers=self.headers)if response.status_code == 200:try:data = json.loads(response.content.decode('utf-8'))except json.JSONDecodeError:time.sleep(0.5)res = str(response.content.decode()).replace('\\', "")data = json.loads(res)return datadef read_json(self, page=1):"""读取json的内容提取需要的数据"""data = self.get_json(page)if self.end_page is None:print(data)self.end_page = data['listNum'] // 30 + 1for i in (data['data']):try:if self.headers is None or self.width is None:yield i['thumbURL']else:if i['height'] == self.height and i['width'] == self.width:yield i['thumbURL']except KeyError:if i is None:print('当前页面获取完毕')def down_img(self, page=1):"""下载图片"""for url_id, url in enumerate(self.read_json(page)):with open(f'{self.BATH_DIR}\{page}_{url_id}.jpg', 'wb') as f:try:content = requests.get(url).contentexcept requests.HTTPSConnectionPool:self.err_list.append({f'{page}{url_id}':url})f.write(content)f.close()print(f'成功下载第{url_id}个图片{url}')else:return page+1def run(self):if not self.world:self.world = input('所需要爬去的关键字\n>>>').strip()self.down_img()pool = Pool(max_workers=self.theadings)results = pool.map(self.down_img, range(2, self.end_page))for i in results:print(i)

Python爬取百度图库相关推荐

  1. python爬百度翻译-Python爬取百度翻译(利用json提取数据)

    本篇文章给大家带来的内容是关于Python爬取百度翻译(利用json提取数据),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 工具:Python 3.6.5.PyCharm开发工具. ...

  2. python爬取百度使用kw关键字爬取时出现,百度安全验证,解决方法

    python爬取百度使用kw关键字爬取时出现,百度安全验证,解决方法 之前爬取百度用kw时的代码(没有任何问题) import requestsurl = 'http://www.baidu.com/ ...

  3. python爬取百度贴吧图片库_python爬取百度贴吧的图片2

    今天看了一下beautifulsoup库的用法,把昨天的python爬取百度贴吧的图片1的代码更新成使用beautifulsoup库的函数来实现.用的还是不太熟练,但是感觉比正则表达式写起来容易了一些 ...

  4. python爬取百度搜索_使用Python + requests爬取百度搜索页面

    想学一下怎样用python爬取百度搜索页面,因为是第一次接触爬虫,遇到一些问题,把解决过程与大家分享一下 1.使用requests爬取网页 首先爬取百度主页www.baidu.com import r ...

  5. Python爬取百度翻译及有道翻译

    Python爬取百度翻译及网易有道翻译 百度翻译 一.简介 明确翻译链接,百度翻译链接:https://fanyi.baidu.com/,但是该链接不能为我们提供翻译的内容,此时需要在chrome浏览 ...

  6. 【Python】python爬取百度云网盘资源-源码

    今天测试用了一下python爬取百度云网盘资源. 标签: <无> 代码片段 [代码][Python]代码 import urllib import urllib.request impor ...

  7. python爬取百度在线语音合成的音频

    python爬取百度在线语音合成 URL:https://ai.baidu.com/tech/speech/tts_online 抓包 api从这里抓包,用的post请求,返回的是base64文件格式 ...

  8. python爬取百度云网盘资源-源码

    今天测试用了一下python爬取百度云网盘资源. 代码片段 import urllib import urllib.request import webbrowser import re def yu ...

  9. python 爬取5566图库图片

    python 爬取5566图库图片 1 import requests 2 import random 3 import re 4 import time 5 import os 6 from bs4 ...

最新文章

  1. springboot mockmvc单元测试
  2. SQLServer多实例更改默认实例
  3. linux dmesg信息哪来的,linux中的dmesg命令简介
  4. ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)
  5. mysql1526错误_mysql 分区 1526错误
  6. 技术详解:基于人脸识别的 AI 弹幕
  7. 扩展 lua require 的行为
  8. Android 面向切面编程-aspjectj应用
  9. Ios开发之定位CLLocationManager
  10. linux 有趣的命令
  11. Netty工作笔记0073---Neety的出站和入站机制
  12. JS中SetTimeOut和SetInterval方法的区别?
  13. semver语义化版本号
  14. VS2022找不到Microsoft.Expression.Interactions.dll
  15. 单声道数据转双声道_单声道转双声道
  16. 解决用友固定资产出现的“不能月末结账,可能月末未结账”的处理办法
  17. 伯努利-欧拉装错信封问题
  18. re管理器修改音量_教你巧用RE管理器修改手机各种系统声音锁屏声音
  19. 中介兴风 深圳楼市起浪
  20. 漫威电影和程序员、Git 到底有什么关系?

热门文章

  1. scala函数自我小结(待更新)
  2. android爬取视频播放地址,Android 视频中抓取图像 - MediaMetadataRetriever
  3. concurrent write to websocket connection
  4. 大数据回顾2017年消费升级:90后上演“手机狂魔”,70后当仁不让,80后...
  5. Linux基础理论简述
  6. Russian Dolls on the Christmas Tree
  7. 如何快速访问StackOverFlow
  8. LUNA 黑天鹅事件:Terra CEO关于项目应急方案的社区AMA
  9. all在java语言什么意思_this什么意思
  10. 如何用一片74LS161和必要的门电路构成一个可控计数器?