Scrapy爬虫代理IP的使用

刷量、爬虫等用户通常通过代理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,
}

即可运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值