DC学院数据分析学习笔记(四):爬虫的一些高级技巧

继续爬虫之旅!做完整个爬虫过程之后,成就感爆棚<( ̄︶ ̄)↗[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)

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

推荐一个免费代理服务器的网站(亲测可用):http://www.xicidaili.com/

3. User-Agent

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

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

这里有个UA大全:http://blog.csdn.net/bone_ace/article/details/52476016

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

OK,基础知识介绍完了。
下面来看一个我在DC学院上课时老师提供的一个例子:

Place Pulse Google街景图爬取

1. 一些前提准备

数据集的网址:http://pulse.media.mit.edu/data/

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

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

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

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

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

开始干吧!

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


import urllib.request as urlrequest
import time
import 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'})

#用设置的代理服务器去新建一个opener
opener = 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!看一下下载的图片:

大功告成!

你可能感兴趣的:(爬虫,python,操作系统)