Python爬虫基础策略

爬虫策略总结

  1. 伪装user agent
    User agent 是HTTP协议的中的一个字段, 作用是描述发出HTTP请求的终端的一些信息。 服务器通过这个字段就可以知道要访问网站的是谁了。每个浏览器,每个正规的爬虫都有其固定的user agent,因此只要将这个字段改为这些知名的user agent,就可以成功伪装了。不过,不推荐伪装知名爬虫,因为这些爬虫很可能有固定的IP,如百度爬虫。与此相对的,伪装浏览器的user agent是一个不错的主意,因为浏览器是任何人都可以用的,换名话说,就是没有固定IP。推荐准备若干个浏览器的user agent,然后每次发送请求的时候就从这几个user agents中随机选一个填上去。IE的几个user agent如下:

    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)
    Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

设置代码如下(假设使用python3 + requsets)

import requests
import random
# random 随机模块,可以用在循环中随机选取User-Agent

headers = [
    {'Users-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)'},
    {'Users-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2) '},
    {'Users-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'},
]
for i in range(10):
    url = 'http://www.baidu.com/'
    header_list = random.sample(headers, 1)  # 从列表中随机拿一个元素,变成一个新的列表
    print(header_one) # 每次选取不用的User-Agent作为参数传递给请求
    res = requests.get(url, headers=header_list[0]) #发起请求
  1. 登录(Login)
    通过登录以及验证码的方式来阻止爬虫程序的常用手段,如果某个IP访问频率异常,则会跳出登录或者验证码是大小网站喜爱使用的手段,因为验证码是图片,用户登录时只需输入一次便可登录成功,而我们程序抓取数据过程中,需要不断的登录,比如我们需要抓取100个用户的个人信息,则需要填100次验证码,而手动输入验证码是不现实的,所以验证码的出现曾经难倒了很多网络爬虫工程师。
    目前在python语言中比较良好的解决方式
    1)利用图像识别技术,识别验证码文本
    2)利用selenium + Phantomjs / Chrome 模拟浏览器行为,对数据进行爬取(需要安装模块和插件)

    相比第一种方式,第二种方式操作简单,异常方便,由于强大的模仿行为可以进行无界面化爬取,也可以使用Chrome进行可视化爬取,在登录上,由于模仿浏览器的行为,不需要进行多次登录,一次登录就可以进行爬取大量数据,但是效率比一般爬虫要稍低。

    from selenium import webdriver
    
    # 创建浏览器对象,发请求
    driver = webdriver.Chrome()
    driver.get("https://www.douban.com/")
    ...
    #具体行为
    
    #关闭页面
    driver.quit()
    
  2. 使用代理
    如果对方用某段时间内某IP的访问次数来判定爬虫,然后将这些爬虫的IP都封掉的话,以上伪装就失效了。由于爬虫的访问量必然比正常用户的大很多,所以使得爬虫程序难以伪装。
    面对这个问题,有两种解决方式,用户可以降低爬虫的访问频率来避免被封IP,或者将高频的访问分发到多个IP,从而达到伪装的效果,这个时候,就需要使用代理了。所谓代理就是介于用户与网站之间的第三者:用户先将请求发到代理,然后代理再发到服务器,这样看起来就像是代理在访问那个网站了。这时,服务器会将这次访问算到代理头上。同时用多个代理的话,单个IP的访问量就降下去了,于是就有可能逃过一劫。不过,这个方法最大的问题就是找到稳定的代理。也可以付费购买私密代理。(稳定)
    免费获取代理IP的网站(大都不太稳定)
    西刺代理网站
    快代理
    全网代理

    python中代理的使用方式(仅仅展示requests,在urllib模块与scrapy框架中代理方式各有不同)

    import requests 
    
    url = "http://www.baidu.com/"
    proxies = {"http":"http://183.129.207.82:11597"}
    # 代理IP与端口
    headers = {"User-Agent":"Mozilla/5.0"}
    
    res = requests.get(url,proxies=proxies,headers=headers)
    print(res.status_code) #正常响应码 200
    
    
  3. 降低访问频率
    如果说找不到又免费又稳定的代理呢?那只好用最后一招了——降低访问频率。这样做可以达到与用代理一样的效果——防止被对方从访问量上看出来。当然,在抓取效率上会差很多。此外,降低访问频率只是一个指导思想,在这个思想下,可以得到很多具体做法,例如:每抓取一个页面就休息随机秒(个人感觉比固定时间的要好);或者限制每天抓取的页面数量。

    如果想要做到完美爬虫,必须要了解请求与响应的每一个细节,爬虫的核心思想就是尽可能的伪装成一个真正的用户,只有了解更多的知识才能在爬与反爬的道理上取得胜利。

猜你喜欢

转载自blog.csdn.net/weixin_43022017/article/details/84668009