DC学院数据分析师(入门)学习笔记----高级爬虫技巧
对于网站来说,实际上是不愿意让大家去爬取它的内容的,因为爬虫可能会对真实的用户带来不太好的影响(很多网站会限制流量,尤其是对爬虫产生的流量,会对服务器带来一定的压力)。所以网站会对爬虫有一定的抵制,如果不注意爬虫的技巧,有可能就被网站封杀IP,以致暂停了。
那么如何能够轻松绕过部分的反爬虫限制,书写我们的爬虫呢??
1.设定程序休止时间
连续不断的进行爬虫的抓取,就会被网站监测出来是一个爬虫程序。所以,我们应该在能够接受的速度内,尽量降低一下自己爬取的频率(中间停1-5秒,再去爬下一个),以免对这些网站产生不必要的影响,这样做也对网站的负荷会比较好。
n为你想要实现的时间间隔
importtime
time.sleep(n)
2.设定代理
设定代理的原因主要有两个:
①、有时候需要爬取的网站,通过我们的网络IP没有办法去进行访问。所以需要设置代理。如:在教育网里访问外网的网站;国内的IP有时候无法访问国外的网站等。
②、有时候,不管我们怎么设置我们的爬取频率,在爬取如新浪微博、Facebook等这些很成熟的网站的时候,这些网站的反爬虫技术很高超,所以会很快的检测到我们的机器爬虫程序,从而会把我们登录访问的ip地址封掉。比如针对facebook,它会禁止这个ip地址再去访问它的网站,即使我们重新启动爬虫,从无论是正常从浏览器访问还是爬虫访问,Facebook都一律不允许这个ip地址再去访问它的网站。
那么,通过代理服务器如何进行呢??
传统:通常直接使用我们的电脑去访问网页。
通过代理服务器:我们发送一个网络的请求,会首先发送到代理服务器上,代理服务器再把这个请求转发到网页所在的网站服务器。网站服务器回复的反馈会先发送到代理服务器上,代理服务器再发送给我们的电脑。在这种情况下,只要我们的电脑和代理服务器的连接是合理快速的,代理服务器和网站服务器的连接是顺畅快速的,通过代理服务器往往就可以加速我们访问目标网页的速度,甚至我们可以访问到一些我们之前无法访问的网页内容。
那么,如何通过python访问代理服务器呢??
#使用urllib.request的两个方法进行代理的设置
proxy = urlrequest.ProxyHandler({'https': '47.91.78.201:3128'})
opener = urlrequest.build_opener(proxy)
代理服务器的存在,可以应对网站禁止某个IP访问的反爬虫措施,代理服务器有着不同的匿名类型,通常我们会挑选中、高级别的代理服务器来访问网页。(使用低级别的是没有用的,网站还是能够知道我们的真实IP,对于我们的爬取时没有任何帮助的,因为它还是能够封掉我们的真实IP)
3.设定User-Agent
网站是可以识别我们是否在使用Python进行爬取,需要我们在发送网络请求时,把header部分伪装成浏览器。
opener.addheaders = [('User-Agent','...')]
用不同浏览器访问的header字符串,放入上述代码省略号的部分即可。
常用的浏览器header有:
网上查看还有这些:
1.QQ浏览器: Mozilla/5.0 (compatible; MSIE 10.0; WindowsNT6.1; WOW64; Trident/6.0; QQBrowser/7.7.24962.400) (我在代码中用的是这个)
2. IE浏览器:Mozilla/5.0(compatible; MSIE 10.0;Windows NT 6.1; WOW64; Trident/6.0)
示例:Place PulseGoogle街景图爬取
这是MIT的学术项目,爬取不同城市的街景地图,然后让人去手工标注图片中的城市哪个更安全,更有趣等等。
举个例子,下面这两个城市的图景。如果认为左边更好的话,就点击左边的城市,如果认为差不多的话就点击等号,
如果认为右边更好的话,就点击右边的城市。
MIT会统计这些标注结果。
这个数据集是这样的:(左边城市是什么,右边城市是什么,某人的打分)
下载下来:
结构:
逗号来分隔每一个属性里面的值
核心任务:
把对应每一个图片ID的谷歌街景图片,根据它告诉我们的这个图片所在的GPS的经纬度的位置,利用readme中看到的google map的api,把这个图片下载下来。
代码及注释:
# coding=utf-8import urllib.request as urlrequest
import time
import random# 1.准备工作:载入包,定义存储目录,连接API
IMG_PATH = './imgs/{}.jpg' # 最终会把下载的图片存到这个目录下面
DATA_FILE = './data/votes.csv'# 记录一下已经下载了哪些图片,把图片id放在里面,这样如果下载中止也能知道哪些已经下载了,
# 这样在下载一个图片之前,我们可以先判断一下这个图片的id是否在这个文件中有,如果有,就不用再下载了。
STORED_IMG_ID_FILE = './data/cached_img.txt'STORED_IMG_IDS = set() # 把已经下载的图片的id放在一个集合里面# readme中提到的google针对下载街景地图的api
# 我们需要修改的是location,即经纬度
IMG_URL = 'https://maps.googleapis.com/maps/api/streetview?size=400x300&location={},{}'# 2.应用爬虫技巧:使用代理服务器、User-Agent
# 根据网上找到的代理服务器来更新一下,因为代理服务器可以运行的时间也是有限制的
proxy = urlrequest.ProxyHandler({'https': '173.213.108.111:3128'}) # 设置代理服务器的地址
#opener = urlrequest.build_opener(proxy)
opener = urlrequest.build_opener()# 设定User-Agent
opener.addheaders = [('User-Agent','Mozilla/5.0 (compatible; MSIE 10.0; WindowsNT 6.1; WOW64; Trident/6.0; QQBrowser/7.7.24962.400) ')]urlrequest.install_opener(opener)# 3.读取图片的id
with open(STORED_IMG_ID_FILE) as input_file:for line in input_file:STORED_IMG_IDS.add(line.strip())# 4.根据提供的votes.csv,进行google街景图片的爬取
with open(DATA_FILE) as input_file: # 读取votes.csvskip_first_line = Truefor line in input_file:if skip_first_line: # 因为第一行是属性行,所以跳过skip_first_line = Falsecontinue# 根据逗号就行拆分成各个属性(这些属性在readme中可以看到)left_id, right_id, winner, left_lat, left_long, right_lat, right_long, category = line.split(',')# 针对左边的图片if left_id not in STORED_IMG_IDS: # 如果左边的图片还没有下载print('saving img {}...'.format(left_id))urlrequest.urlretrieve(IMG_URL.format(left_lat, left_long), IMG_PATH.format(left_id)) # 文件命名为这个图片的idSTORED_IMG_IDS.add(left_id) # 把已经下载的图片的id加进集合中with open(STORED_IMG_ID_FILE, 'a') as output_file: # 把已经下载的图片的id新添加进cached_img.txt中output_file.write('{}\n'.format(left_id))time_interval = random.uniform(1, 5)time.sleep(time_interval) # wait some time, trying to avoid google forbidden (of crawler)# 针对右边的图片if right_id not in STORED_IMG_IDS:print('saving img {}...'.format(right_id))urlrequest.urlretrieve(IMG_URL.format(right_lat, right_long), IMG_PATH.format(right_id))STORED_IMG_IDS.add(right_id)with open(STORED_IMG_ID_FILE, 'a') as output_file:output_file.write('{}\n'.format(right_id))time_interval = random.uniform(1, 5)time.sleep(time_interval) # wait some time, trying to avoid google forbidden (of crawler)
国外服务器的代理地址,可以在 http://www.kuaidaili.com/free/outha/这个网站中找到。
可以看到每个地址对应ip地址所在的国家,匿名的程度等等。
这里需要注意我们不能使用低级(Transparent)代理。
先来运行不使用代理服务器的程序:
速度很慢,存储不动,google在大陆访问起来还是比较困难的。
运行设置代理服务器的程序:
可以顺利进行,这说明我们成功连接到了代理的一个服务器上,再通过这个代理服务器连接到了google上。
在文件夹里可以查看到我们从googlemap中下载到的图片以及图片的id。
DC学院数据分析师(入门)学习笔记----高级爬虫技巧相关推荐
- 数据分析师入门_数据分析师入门基础指南
数据分析师入门 Back in the summer of 2018, I was just starting my first internship as a Data Analyst. 早在201 ...
- 【第90期】关于数据分析师的学习路线,这是我见过最全面的
导读:对于很多初入数据分析领域的小白来说,往往都会陷入迷茫.数据分析的坑很大,一旦走上这条路,就要明确基本方向,不然只会越走越偏,最后耗费力气,毫无收获. 比如你想要成为一名数据分析师,你就可以到招聘 ...
- 01.Java 编程入门学习笔记20210307
Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...
- Java入门学习笔记——郝斌(一)概述及面向对象
Java入门学习笔记--郝斌 1.Java概述 java的起源和发展 java的特点 java的应用领域 java学习目标 环境变量的设置 为什么要设置path? path的设置 有关classpat ...
- dubbo入门学习笔记之入门demo(基于普通maven项目)
注:本笔记接dubbo入门学习笔记之环境准备继续记录; (四)开发服务提供者和消费者并让他们在启动时分别向注册中心注册和订阅服务 需求:订单服务中初始化订单功能需要调用用户服务的获取用户信息的接口(订 ...
- Crypto++入门学习笔记(DES、AES、RSA、SHA-256)
Crypto++入门学习笔记(DES.AES.RSA.SHA-256) 背景(只是个人感想,技术上不对后面的内容构成知识性障碍,可以skip): 最近,基于某些原因和需要,笔者需要去了解一下Crypt ...
- 机器学习入门学习笔记:(4.2)SVM的核函数和软间隔
前言 之前讲了有关基本的SVM的数学模型(机器学习入门学习笔记:(4.1)SVM算法).这次主要介绍介绍svm的核函数.软间隔等概念,并进行详细的数学推导.这里仅将自己的笔记记录下来,以便以后复习查看 ...
- 机器学习入门学习笔记:(3.2)ID3决策树程序实现
前言 之前的博客中介绍了决策树算法的原理并进行了数学推导(机器学习入门学习笔记:(3.1)决策树算法).决策树的原理相对简单,决策树算法有:ID3,C4.5,CART等算法.接下来将对ID3决策树算法 ...
- 机器学习入门学习笔记:(2.2)线性回归python程序实现
上一篇博客中,推导了线性回归的公式,这次试着编程来实现它.(机器学习入门学习笔记:(2.1)线性回归理论推导 ) 我们求解线性回归的思路有两个:一个是直接套用上一篇博客最后推导出来的公式:另一 ...
- 汇编入门学习笔记 (十二)—— int指令、port
疯狂的暑假学习之 汇编入门学习笔记 (十二)-- int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...
最新文章
- 自动驾驶感知系统盘点
- 给AI系统做“安全体检”,阿里安全提出自动化AI对抗平台CAA | AAAI 2021
- 《逻辑与计算机设计基础(原书第5版)》——1.2 计算机系统设计的抽象层次...
- android输出log,Android开发 Release情况下也能输出log
- base64码 java_工具类:Java将图片变成base64码
- Oracle-数据库对象(index、synonsym、view、sequence、tablespace)
- databtables 设置(显示)行号
- C# 字符,字符串和文本处理。
- qt 子窗口写到线程就卡死_QT/C++实现卡通漫画风格化
- Quay (3) - 访问权限管理
- TortoiseSVN 配合 Beyond Compare 3 或 WinMerge 的设置
- 百度 UEditor--自定义上传文件路径及读取文件
- 使用c#访问access数据库
- matlab对多维数组转置,C++向matlab engine传递二维数组,互为转置
- java中新建对象设为null 和new 一个对象的区别
- XML解析——Java中XML的四种解析方式
- AES对称加密原理及服务
- 硬盘克隆 计算机更换硬盘,换硬盘数据怎么办 看一招本地磁盘对拷
- 运行python文件、电脑突然黑屏_电脑运行中总是突然黑屏怎么办?
- 《欲罢不能:刷屏时代如何摆脱行为上瘾》读书笔记
热门文章
- led灯光衰怎么解决_揭秘LED灯具光衰原因
- 计算机word表格怎么求和,如何在Word中插入Excel自动汇总a求和表格,上班族必备技巧...
- 4.25 C语言练习(然后是几点:根据起始时间和流逝的时间计算出终止时间。计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。)
- Android显示gif格式图片
- dolphinscheduler 2.0.3 Docker部署 不支持mysql的解决办法
- 职业选择与职业规划【转载】
- 建立了一个博客园创业者QQ群
- easysat源码解读(一)
- 解决django admin表的外键关联数据过多响应时间过长问题
- python转化时区