刷量、爬虫等用户通常通过代理ip来突破限制,爬虫代理IP一般采集一次或者多次就会更换ip,如局域网对上网用户的端口、目的网站、协议、游戏、即时通讯软件等的限制,网站对于IP的访问频率、访问次数的限制等;另一方面,通过代理也可以隐藏用户的真实身份,访问一些不希望对方知道你IP的服务器,爬取一些数据等等。
那么问题来了,使用代理就一定可以隐藏用户的真实身份吗?其实不然,代理IP分为三种:透明代理,普通匿名代理,高级匿名代理。
(1) 透明代理
在透明代理中,代理服务器将客户端的信息转发至目标访问对象,并没有完全隐藏客户端真实的身份。即服务器知道客户端使用了代理IP,并且知道客户端的真实IP地址。
(2) 普通匿名代理
在普通匿名代理中,代理服务器用自己的IP代替了客户端的真实IP,但是告诉了目标访问对象这是代理访问。
(3) 高匿代理
在高匿代理中,代理服务器良好地伪装了客户端,不但用一个随机的IP代替了客户端的IP,也隐藏了代理信息,服务器不会察觉到客户端是通过代理实现访问的,即用户仿佛就是直接使用代理服务器作为自己的客户端。
服务器是如何识别客户端是否使用了代理IP呢?
通常,服务器通过获取HTTPRequest的头部信息的相关字段来判断客户端是否使用了代理。该字段包括REMOTE_ADDR、HTTP_VIA、HTTP_X_FORWARDED_FOR等。
1、透明代理(Transparent Proxy)
REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
2、普通匿名代理(Anonymous Proxy)
REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
3、高匿代理(Elite proxy或High Anonymity Proxy)
REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
固安捷手机端商品信息的爬取:
一、类目信息爬取
分析网站,找到类别的接口,POST请求接口返回数据,观察层级结构,发现共有三级类目,则依次爬取类目信息。分为类目名称、类目对应的categoryCode,以及类目的链接(链接为固定链接与categoryCode拼接而成),以及层级数和各个级别类目的父级。
二、列表页的爬取
找到网站列表信息的接口链接,同样是POST请求方式请求列表接口。注意:请求接口是需要配置荷载参数。注意几个关键的参数值。一个是pages总页数,categoryCode类别编码,pageNo当前页数。通过当前页数与总页数的判断大小,来实现翻页,通过累加俩实现翻页数据的爬取。爬取字段包括商品编码,商品名称,商品链接。目前爬取15万条左右。
三、详情页
找到网站商品详情信息的接口链接,同样是POST请求方式请求详情接口。同样配置荷载,关键参数就是商品编码。一个商品编码的sku中存在一个spu的存在,就需要爬取spu中的所有的sku信息。返回数据,发现spu信息存在于字典items中,循环遍历信息得到商品信息。另外外加一个字典信息main_html(商品长图),update到之前字典中,一并存入到MongoDB数据库中。
问题:出现了反爬。每当详情信息爬取到几万条后就出现403报错,发现出现了反爬机制,通过配置headers发现不能解决问题。最后只能通过使用ip代理来实现爬取。
通过在文件middlewares.py编写代码。
import requests,random
from datetime import datetime
class ProxyMiddleware(object):
def getIP(self):
a = requests.get(
"芝麻代理IP ").json().get(
'data') #芝麻代理IP
b = []
for i in a:
IP = i.get("ip")
PORT = i.get("port")
IP_PROT = str(IP) + ":" + str(PORT)
Expire_time = int(i.get("expire_time").split(" ")[1].replace(":", ""))
now_time = int(str(datetime.now()).split('.')[0].split(" ")[1].replace(":", ""))
if Expire_time < now_time:
b.append(IP_PROT)
h = len(b)
if h != 0:
num = random.randint(0, h - 1)
c = b[num]
thisProxy = {
"https": "https://{}".format(c)
}
m = thisProxy.get('https')
return m
def process_request(self, request,spider):
a=self.getIP()
request.meta['proxy'] = a
在setings.py中设置
DOWNLOADER_MIDDLEWARES = {
# 'GuanjieSpider.middlewares.ProxyMiddleware': 543,
}
即可运行