博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DC学院数据分析学习笔记(四):爬虫的一些高级技巧
阅读量:5791 次
发布时间:2019-06-18

本文共 5554 字,大约阅读时间需要 18 分钟。

继续爬虫之旅!做完整个爬虫过程之后,成就感爆棚<( ̄︶ ̄)↗[GO!]

三大爬虫技巧

1. 设定 程序休止的时间

n为想要实现的时间间隔

import time time.sleep(n)

2. 设定代理

#使用urllib.request的两个方法进行代理的设置proxy = urlrequest.ProxyHandler({'https': '47.91.78.201:3128'})opener = urlrequest.build_opener(proxy)

代理的不同匿名类型

低级别(Transparent Proxy)

服务器可以知道在使用代理,且知道你的真实IP

中级别(Anonymous Proxy)

服务器可以知道你在使用代理,但无法知道真实的IP

高级别(Elite Proxy/Highly Anonymous Proxy)

服务器无法知道在使用代理

推荐一个免费代理服务器的网站(亲测可用):

3. User-Agent

UserAgent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,UserAgent也简称UA。这是为了向我们所访问的网站提供我们所使用的浏览器类型(版本) 等信息的,比如用手机访问和电脑访问时看到的界面可能是不一样的,这就是网站通过UA来判断的。

当然,UA也可以进行伪装。

网站是可以识别你是否在使用Python进行爬取,需要你在发送网络请求时,把header部分伪装成浏览器

这里有个UA大全:

opener.addheaders = [('User-Agent','...')]

OK,基础知识介绍完了。

下面来看一个我在DC学院上课时老师提供的一个例子:

Place Pulse Google街景图爬取

1. 一些前提准备

数据集的网址:

image

image

第二项研究的目标是将数据收集范围扩展到来自六大洲28个国家的56个城市和6个新的评估问题。 在线通过用户根据看图片来投票这城市六个特征,如:是否安全,是否天气好等等。

来自第二次研究的数据将有助于开发一个数据集,可以用来训练机器学习算法,这些算法可以帮助我们识别确定图像引发的评估反应的特征,并且推断图像的评分,从而扩展方法到新的城市。

这样通过训练,之后我们就不需要人去标注,而是可以用模型预测.

OK !

实验时这样的,先下载上图中的数据集,只有50兆,里面存放的时图片的经纬度。我们就是是要通过编写一个python的爬虫去利用数据集中的已经告诉我们的经纬度信息去进行自动的它用于比较的图片(如上图中的两张对比安全度的图片)的抓取。

打开下载下来文件夹中的readme文件,发现里面提供了一个google地图的API,OK结合下载下来的csv文件中图片的经纬度信息,可以通过这个API把图片下载下来。

开始干吧!

2. 准备工作:载入包,定义存储目录,连接API

image

image

import urllib.request as urlrequestimport timeimport random#定义了一些目录IMG_PATH = './imgs/{}.jpg'  ##存储下载下来的图片DATA_FILE = './data/votes.csv'  ##将所有的数据文件存储在data的目录下STORED_IMG_ID_FILE = './data/cached_img.txt' ##记录已经下载了哪些图片(ID),防止中断后重新下载重复STORED_IMG_IDS = set() ##将cached_img.txt中的图片ID存放到集合中,方便检查是否这张图片已经下载了#这个即是在readme中看到的下载街景地图的API,而我们需要填的属性就是 {经度} 和 {维度} ,#之后可以用string中的format函数将这两个参数填入IMG_URL = 'https://maps.googleapis.com/maps/api/streetview?size=400x300&location={},{}'

3. 应用爬虫技巧:使用代理服务器、User-Agent

#创建一个代理服务器的地址,这里要去网上找代理服务器(不要用我的这个,一般代理服务器是有存活时间的)proxy = urlrequest.ProxyHandler({'http': '122.114.31.177:808'})#用设置的代理服务器去新建一个openeropener = urlrequest.build_opener(proxy)#在这里进行上文提到的“UA伪装”opener.addheaders = [('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.1 Safari/603.1.30')]# 用urlrequest去打开网页urlrequest.install_opener(opener)

4. 读取图片的id

# 从下载的图片的ID文件STORED_IMG_ID_FILE中按行依次读取到STORED_IMG_IDS这个集合中with open(STORED_IMG_ID_FILE) as input_file:    for line in input_file:        STORED_IMG_IDS.add(line.strip())

5. 根据提供的图片id文档,进行google街景图片的爬取

with open(DATA_FILE) as input_file:        skip_first_line = True ##因为第一行是属性名称,所以跳过第一行        for line in input_file:            if skip_first_line:                skip_first_line = False                continue            #进行切分,得到左边图片的经纬度,右边图片的经纬度,以及获胜的图片            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))                # 1.在API中添加进经纬度;2.存入到之前的文件夹中,名字为图片的ID                urlrequest.urlretrieve(IMG_URL.format(left_lat, left_long), IMG_PATH.format(left_id))                # 在集合中加入已经下载的图片ID                STORED_IMG_IDS.add(left_id)                #防止程序终止,集合中ID消失,也将已下载ID存储进硬盘中                with open(STORED_IMG_ID_FILE, 'a') as output_file:                    output_file.write('{}\n'.format(left_id))                time.sleep(1)  # 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.sleep(1)  # wait some time, trying to avoid google forbidden (of crawler)                ##为了防止被检测出来,也可以用随机函数:                ## time.sleep(random.random()*5)                 ##随机停顿0~5s的时间
saving img 513d2dbefdc9f03587002515...saving img 51413b2ffdc9f049260058ca...saving img 513d7e23fdc9f0358700733a...saving img 513d7ac3fdc9f0358700693f...saving img 50f60c4dbeb2fed91000028d...saving img 513cb652fdc9f03587000a1e...saving img 513d9ff9fdc9f0358700887c...saving img 513cd544fdc9f03587001efc...saving img 513f320cfdc9f0358700e030...saving img 513cc3acfdc9f035870016c3...saving img 50f60b90beb2fed910000085...saving img 513d6debfdc9f0358700521f...saving img 513d6a38fdc9f035870049cb...saving img 513e6b98fdc9f0358700c055...saving img 513da088fdc9f035870089c5...saving img 513d7bbefdc9f03587006c7c...saving img 513d7971fdc9f035870064d4...saving img 513d7eeafdc9f035870074e2...saving img 50f5eb1cfdc9f065f0007fa8...saving img 50f43bb0fdc9f065f0003356...saving img 513d79d4fdc9f0358700660c...saving img 51421ac1fdc9f0492600839e...saving img 513f2a7afdc9f0358700d543...saving img 51413978fdc9f04926005495...saving img 5185cf07fdc9f03fd5000ebd...saving img 51422806fdc9f04926008700...saving img 50f5e6fefdc9f065f0006eb2...saving img 513d6d7efdc9f0358700516c...saving img 513d57fefdc9f03587003271...saving img 513e62a8fdc9f0358700b718...saving img 513f2ac2fdc9f0358700d5be...saving img 513cba52fdc9f03587000dcb...saving img 51421b25fdc9f0492600840a...saving img 51414717fdc9f04926006993...saving img 51413ca9fdc9f04926005b7e...saving img 513d6890fdc9f035870043fc...saving img 50f44808fdc9f065f0003cca...saving img 513d7b26fdc9f03587006a76...saving img 51408b84fdc9f0358700e953...saving img 514133e3fdc9f04926004477...saving img 513e1b3afdc9f03587009402...saving img 513d9dfefdc9f03587008276...saving img 51409acdfdc9f04926000fbc...

OK!看一下下载的图片:

image

大功告成!

转载地址:http://zdzfx.baihongyu.com/

你可能感兴趣的文章
mysql-error 1236
查看>>
sshd_config设置参数笔记
查看>>
循序渐进Docker(一)docker简介、安装及docker image管理
查看>>
jsp页面修改后浏览器中不生效
查看>>
大恶人吉日嘎拉之走火入魔闭门造车之.NET疯狂架构经验分享系列之(四)高效的后台权限判断处理...
查看>>
信号量实现进程同步
查看>>
Spring4-自动装配Beans-通过构造函数参数的数据类型按属性自动装配Bean
查看>>
win10.64位wnmp-nginx1.14.0 + PHP 5. 6.36 + MySQL 5.5.59 环境配置搭建 结合Thinkphp3.2.3
查看>>
如何查看python selenium的api
查看>>
Python_Mix*random模块,time模块,sys模块,os模块
查看>>
iframe刷新问题
查看>>
数据解码互联网行业职位
查看>>
我所见的讲的最容易理解,逻辑最强的五层网络模型,来自大神阮一峰
查看>>
js实现复选框的操作-------Day41
查看>>
数据结构化与保存
查看>>
chrome浏览器开发者工具之同步修改至本地
查看>>
debian7 + wheezy + chromium + flashplayer
查看>>
AOP
查看>>
进阶开发——文档,缓存,ip限速
查看>>
vue中子组件需调用父组件通过异步获取的数据
查看>>