[TOC]

1. 前言

对于一张网页,我们往往希望它是结构良好,内容清晰的,这样搜索引擎才能准确地认知它。 而反过来,又有一些情景,我们不希望内容能被轻易获取,比方说电商网站的交易额,教育网站的题目等。因为这些内容,往往是一个产品的生命线,必须做到有效地保护。这就是爬虫与反爬虫这一话题的由来。 对于图片进行爬虫整体操作过程可分为三个步骤:

获取页面信息 读取图片链接 将图片保存在本地指定目录下

2. 常见反爬虫策略

但是世界上没有一个网站,能做到完美地反爬虫。

如果页面希望能在用户面前正常展示,同时又不给爬虫机会,就必须要做到识别真人与机器人。因此工程师们做了各种尝试,这些策略大多采用于后端,也是目前比较常规单有效的手段,比如:

  • User-Agent + Referer检测
  • 账号及Cookie验证
  • 验证码
  • IP限制频次

而爬虫是可以无限逼近于真人的,比如:

  • chrome headless或phantomjs来模拟浏览器环境
  • tesseract识别验证码
  • 代理IP淘宝就能买到

所以我们说,100%的反爬虫策略?不存在的。 更多的是体力活,是个难易程度的问题。

不过作为前端工程师,我们可以增加一下游戏难度,设计出一些**很(sang)有(xin)意(bing)思(kuang)**的反爬虫策略。

3. 前端与反爬虫

3.1 FONT-FACE拼凑式

例子:猫眼电影

猫眼电影里,对于票房数据,展示的并不是纯粹的数字。 页面使用了font-face定义了字符集,并通过unicode去映射展示。也就是说,除去图像识别,必须同时爬取字符集,才能识别出数字。

并且,每次刷新页面,字符集的url都是有变化的,无疑更大难度地增加了爬取成本。

3.2 BACKGROUND拼凑式

例子:美团

与font的策略类似,美团里用到的是background拼凑。数字其实是图片,根据不同的background偏移,显示出不同的字符。

并且不同页面,图片的字符排序也是有区别的。不过理论上只需生成0-9与小数点,为何有重复字符就不是很懂。

3.3 字符穿插式

例子:微信公众号文章

某些微信公众号的文章里,穿插了各种迷之字符,并且通过样式把这些字符隐藏掉。 这种方式虽然令人震惊…但其实没有太大的识别与过滤难度,甚至可以做得更好,不过也算是一种脑洞吧。

3.4 伪元素隐藏式

例子:汽车之家

汽车之家里,把关键的厂商信息,做到了伪元素的content里。 这也是一种思路:爬取网页,必须得解析css,需要拿到伪元素的content,这就提升了爬虫的难度。

3.5 元素定位覆盖式

例子:去哪儿

还有热爱数学的去哪儿,对于一个4位数字的机票价格,先用四个i标签渲染,再用两个b标签去绝对定位偏移量,覆盖故意展示错误的i标签,最后在视觉上形成正确的价格…

这说明爬虫会解析css还不行,还得会做数学题。

3.6 IFRAME异步加载式

例子:网易云音乐

网易云音乐页面一打开,html源码里几乎只有一个iframe,并且它的src是空白的:about:blank。接着js开始运行,把整个页面的框架异步塞到了iframe里面….

不过这个方式带来的难度并不大,只是在异步与iframe处理上绕了个弯(或者有其他原因,不完全是基于反爬虫考虑),无论你是用selenium还是phantom,都有API可以拿到iframe里面的content信息。

3.7 字符分割式

例子:全网代理IP

在一些展示代理IP信息的页面,对于IP的保护也是大费周折。

他们会先把IP的数字与符号分割成dom节点,再在中间插入迷惑人的数字,如果爬虫不知道这个策略,还会以为自己成功拿到了数值;不过如果爬虫注意到,就很好解决了。

3.8 字符集替换式

例子:去哪儿移动侧

同样会欺骗爬虫的还有去哪儿的移动版。

html里明明写的3211,视觉上展示的却是1233。原来他们重新定义了字符集,3与1的顺序刚好调换得来的结果…

4.实例:对百度图库进行爬虫

import re
import os
import time
import requests
# from selenium import webdriver#########################
###此段代码不需要关心啥意思###
#########################if not os.path.exists('百度图片'):os.mkdir('百度图片')#####################
###限制30张图片的代码###
##################### 获取所有图片
response = requests.get('http://image.baidu.com/search/index?ct=201326592&cl=2&st=-1&lm=-1&nc=1&ie=utf-8&tn=baiduimage&ipn=r&rps=1&pv=&fm=rs7&word=风景')
data = response.text
img_desc_dics = re.findall("app.setData(\('imgData.*?\));", data, re.S)[0]
img_desc_dics = eval(str(img_desc_dics))# 获取所有图片的数据
img_datas = img_desc_dics[1]['data']
count = 0
for img_data in img_datas:# 获取搜索图片的参数os_ = img_data.get('os')cs_ = img_data.get('cs')if os_ and cs_:# 获取搜索图片的信息img_search_url = f'http://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%A3%8E%E6%99%AF&step_word=&hs=0&pn=1&spn=0&di=195030&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs={cs_}&os={os_}'img_search_response = requests.get(img_search_url)img_search_data = img_search_response.text# 获取图片信息img_url = re.findall('''\('firstSc'\);" src="(.*?)"''', img_search_data)[0]img_name = img_url.split('/')[-1]img_name = os.path.join('百度图片', img_name)  # 拼接出图片的地址,如 百度图片/3822951_144045377000_2.jpg# 保存图片img_response = requests.get(img_url)img_data = img_response.contentfw = open(img_name, 'wb')fw.write(img_data)fw.flush()# 提示count += 1print(f'{img_name}保存成功,成功保存{count}张')# 防止百度禁ip,慢一点time.sleep(0.01)

#########################################################################
###自行百度selenium的用法,使用这一套代码可以无限爬取所有图片,否则将被限制30张##### 记得加库哦
########################################################################page_count_end = 2  # 爬取 指定数字(10)* 30 = 300张图片
chrome = webdriver.Chrome()## 安装谷歌插件
##http://chromedriver.storage.googleapis.com/index.html?tdsourcetag=s_pcqq_aiomsg
## 查看你电脑的谷歌版本,寻找对应版本进行下载解压try:chrome.implicitly_wait(10)chrome.get('http://image.baidu.com/search/index?ct=201326592&cl=2&st=-1&lm=-1&nc=1&ie=utf-8&tn=baiduimage&ipn=r&rps=1&pv=&fm=rs7&word=风景')js_code = '''window.scrollTo(0, document.body.scrollHeight);var lenOfPage = document.body.scrollHeight;return lenOfPage'''# selenium控制爬取页数count = 0page_count = 0while page_count < page_count_end:try:page_count += 1chrome.execute_script(js_code)time.sleep(0.3)except:continueimg_desc_search_urls = re.findall('href="(/search/detail\?.*?)"', chrome.page_source, re.S)  # re.S使.可以匹配换行符# 获取所有图片的数据for img_data in img_desc_search_urls:try:# 获取搜索图片的参数os_ = re.findall('os=(.*?)&amp;', img_data)[0]cs_ = re.findall('cs=(.*?)&amp;', img_data)[0]if os_ and cs_:# 获取搜索图片的信息img_search_url = f'http://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E9%A3%8E%E6%99%AF&step_word=&hs=0&pn=1&spn=0&di=195030&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=-1&cs={cs_}&os={os_}'img_search_response = requests.get(img_search_url)img_search_data = img_search_response.text# 获取图片信息img_url = re.findall('''\('firstSc'\);" src="(.*?)"''', img_search_data)[0]img_name = img_url.split('/')[-1]img_name = os.path.join('百度图片', img_name)  # 拼接出图片的地址,如 百度图片/3822951_144045377000_2.jpg# 保存图片img_response = requests.get(img_url)img_data = img_response.contentfw = open(img_name, 'wb')fw.write(img_data)fw.flush()# 提示count += 1print(f'{img_name}保存成功,成功保存{count}张')# 防止百度禁ip,慢一点time.sleep(0.01)except:continueexcept Exception:passfinally:chrome.close()

结果

由于百度的反扒措施不断更新,如果想要在一段时间之后进行爬虫,需要从新寻找规律

5.总结

对于每一个网站进行爬虫,都是有一定的规律的,每一个网站,尤其是大型网站都是规律的排版,做爬虫尤其要重视细节,细心决定成败,将你需要的文字,图片,或者视频,文件等,找出他们的链接,进行多个分析,耐心找出其中的规律,就是你成功的关键。

转载于:https://www.cnblogs.com/SkyOceanchen/p/11237851.html

对大型网站图片进行爬虫相关推荐

  1. 抓取整个网站图片的爬虫

    为什么80%的码农都做不了架构师?>>>    写了一个抓取http://www.youwu.cc/index.html整个网站图片的爬虫,使用redis去重和任务队列,这样可以避免 ...

  2. 【推荐】大型网站图片服务器架构的演进

    构建在Windows平台之上的网站,往往会被业内众多架构师认为很"保守".很大部分原因,是由于微软技术体系的封闭和部分技术人员的短视造成的.由于长期缺乏开源支持,所以只能" ...

  3. Google图片和NASA 网站图片的爬虫

    1.根据关键字爬取NASA网站上的图片 首先针对需要爬取的网站进行分析,输入关键字查找需要的内容 通过关键字请求,网页每次会加载20张的缩略图,分析网页源码能够很容易的找到缩略图的url: 然后再点开 ...

  4. 爬取某壁纸网站图片(简单爬虫,入门)

    1. 工具 PyCharm Python3.7 requests库 2. 网页分析 2.1 F12打开浏览器开发者模式,使用抓包工具分析网页. 2.2 浏览分析网页,发现先向下滚动时,会向服务器发送请 ...

  5. 《大型网站架构技术》系列分享专栏

    在这里整理一些大型网站架构方面的技术文章,包括大型网站存储,架构,静态化处理,高并发,高性能方面的问题处理,解决方案等知识 <大型网站架构技术>已整理成PDF文档,点击可直接下载至本地查阅 ...

  6. python爬取京东商品图片_python利用urllib实现爬取京东网站商品图片的爬虫实例

    本例程使用urlib实现的,基于python2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -* ...

  7. 减少HTTP请求之合并图片详解(大型网站优化技术)

    一.相关知识讲解 看过雅虎的前端优化35条建议,都知道优化前端是有多么重要.页面的加载速度直接影响到用户的体验.80%的终端用户响应时间都花在了前端上,其中大部分时间都在下载页面上的各种组件:图片,样 ...

  8. python爬虫,g-mark网站图片数据爬取及补坑

    应用python对g-mark网站图片数据爬取,同时但对于数据抓取失败的图片进行补坑(重新爬取操作),由于是日本网站,没有梯子访问的话,特别容易访问超时,比较合适的补坑操作是直接将数据采集到数据库,而 ...

  9. C++编写爬虫脚本爬取网站图片

    C++编写爬虫脚本爬取网站图片 整体代码设计思路 具体功能实现 初始化网络库 url中爬取图片 获取网页源代码 连接主机 url中获取主机名和文件名 html中提取连接 html中提取图片链接 获取并 ...

最新文章

  1. PC机键盘的处理过程
  2. php如何实现根据地区内筛选,PHP区块查询实现方法分析
  3. 操作系统(三)| 进程同步详解(主要任务、制约关系、临界资源、临界区、同步机制遵循规则、信号量机制、信号量的应用)
  4. SAP云服务新订购量增长103%
  5. Java队列与栈转换中String.Valueof()使用
  6. Spring+Spring Security+JSTL实现的表单登陆的例子
  7. List,Set和Map详解及其区别和他们分别适用的场景
  8. python——学习笔记1
  9. 不扯概念,用例子演示什么是脏读,不可重复读,幻读?
  10. 使用鸿蒙系统的家电厂商,除了华为外!谁还会用鸿蒙系统?米OV们不可能:这些巨头才会用...
  11. python求职者的建议_Python 求职和建议-从认识自己出发
  12. 楷书和草书哪幅更具有艺术性?
  13. 中国可生物降解和生物可吸收支架行业市场供需与战略研究报告
  14. mac java tomcat_mac平台tomcat部署web项目
  15. Asp.net实用技巧
  16. 剑指offer_输入一个字符串,按字典序打印出该字符串中字符的所有排列
  17. python爬虫线上编辑_Python 爬虫入门《中》
  18. 【大咖有约】子衿技术团队徐戟:DBA职场进阶之路
  19. win7系统怎么用笔记本做wifi热点
  20. 鹅厂java面试真题汇总

热门文章

  1. strcasecmp 的使用
  2. 华为荣耀5cvs华为v9play_华为荣耀V9play和荣耀V9比哪个值得买?有什么区别?
  3. 平衡二叉树旋转原理【超详细解读】
  4. 从3dsmax导出Dae模型到papervision3D
  5. evus是什么意思_不知道EVUS是什么鬼?有美签你也去不了美国!
  6. 获取 enum key 的方法
  7. 可以用旋转法绘制平行四边形
  8. Java中令人眼花撩乱的数字魔法!
  9. 基于firefly rk3399刷写ubuntu18.04系统
  10. 【计算机专业】手把手教你毕业论文参考文献怎么弄