最近因为公司业务需求写了一套分布式多线程的爱某查爬虫系统,实现了对爱某查整个网站的全部数据各种维度的采集和存储,经常在论坛或爬虫群里面看一些做技术的朋友在爬爱某查类型的网站的时候会遇到以下几个问题,所以写了这篇文章一些简单的解决方案分享给大家。
1、目标网站的难度系数比拼
比如爱某查和天某查哪一个的数据更难爬呢?其实在准备爬爱某查数据的时候,我对启某宝、企某查类似的网站分布从数据的完整性和数据的更新及时性分析了,结果个人觉得爱某查的数据比其他网站的要完整,数据维度要多一些,数据更新的时候也比较快,所以最后选择了爬取天某查里面的企业数据,难度相比也要稍等小一点。
2. 采集速度太频繁了,会被封IP问题 怎么解决
当我们的爬虫程序向目标网站发出http请求的时候,正常情况下返回200状态,说明请求合法被接受,并且会返回数据,但是这次的目标网站想对一般网站反爬要严厉很多,其中最普遍的一个就是如果检查到同一个IP来不断的采集他网站的数据,那么他会被这个IP列入异常黑名单,您再去采集它网站数据的时候,那么就永远被拦截了。这种情况最简单的就是使用爬虫代理IP去访问,每一次请求的时候都采用代理IP方式去请求,而且这个代理IP是随机变动的,每次请求都不同。
爬虫程序实现数据采集的过程
在进行爬取数据的过程中我们经常会使用到一些库,requests属于第三方库,使用起来比urllib要简单不少,且功能更加强大,是最常用的请求库。以下是requests加上优质爬虫代理IP实现数据采集的过程:
#! -*- encoding:utf-8 -*- import requests import random # 要访问的目标页面 targetUrl = "https://aiqicha.baidu.com/" # 要访问的目标HTTPS页面 # targetUrl = "https://aiqicha.baidu.com/" # 代理服务器(产品官网 www.16yun.cn) proxyHost = "t.16yun.cn" proxyPort = "31111" # 代理验证信息 proxyUser = "16WNFAPS" proxyPass = "458798" proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { "host" : proxyHost, "port" : proxyPort, "user" : proxyUser, "pass" : proxyPass, } # 设置 http和https访问都是用HTTP代理 proxies = { "http" : proxyMeta, "https" : proxyMeta, } # 设置IP切换头 tunnel = random.randint(1,10000) headers = {"Proxy-Tunnel": str(tunnel)} resp = requests.get(targetUrl, proxies=proxies, headers=headers) print resp.status_code