美文网首页
阿里大牛亲授,用Python爬虫Scrapy框架IP代理的配置与

阿里大牛亲授,用Python爬虫Scrapy框架IP代理的配置与

作者: IT领域君 | 来源:发表于2020-05-18 23:11 被阅读0次

    前言

    在调试爬虫的时候,新手都会遇到关于ip的错误,好好的程序突然报错了,怎么解决,关于ip访问的错误其实很好解决,但是怎么知道解决好了呢?怎么确定是代理ip的问题呢?由于笔者也在不断学习过程中,所以有些解释可能和Python大佬们的解释不一样,如果有不对的地方,请大家多多提携。感谢大家阅读,好了下面正文开始!

    代理ip的逻辑在哪里

    一个scrapy 的项目结构是这样的

    scrapydownloadertest  # 项目文件夹

    │  items.py      # 定义爬取结果存储的数据结构

    │  middlewares.py  # 中间件(可以理解java的过滤器拦截器)

    │  pipelines.py  # 数据管道,对获取到的数据做操作

    │  settings.py  # 项目的配置文件

    │  __init__.py  # 初始化逻辑

    ├─spiders  # 放置 Spiders 的文件夹

    │  │  httpProxyIp.py  # 爬取到结果后的处理类

    │  │  __init__.py    # spider初始化逻辑

    scrapy.py

    复制代码

    从上图可以发现,代理ip的设置肯定是在发送请求之前就要设置好,那么唯一符合条件的地方就是 middlewares.py ,所以关于代理的相关逻辑都写在这个里面。直接在其中添加如下代码:

    # Scrapy 内置的 Downloader Middleware 为 Scrapy 供了基础的功能,

    # 定义一个类,其中(object)可以不写,效果一样

    class SimpleProxyMiddleware(object):

    # 声明一个数组

    proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080']

    # Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middleware

    def process_request(self, request, spider):

    # 随机从其中选择一个,并去除左右两边空格

    proxy = random.choice(self.proxyList).strip()

    # 打印结果出来观察

    print("this is request ip:" + proxy)

    # 设置request的proxy属性的内容为代理ip

    request.meta['proxy'] = proxy

    # Downloader Middleware的核心方法,只有实现了其中一个或多个方法才算自定义了一个Downloader Middleware

    def process_response(self, request, response, spider):

    # 请求失败不等于200

    if response.status != 200:

    # 重新选择一个代理ip

    proxy = random.choice(self.proxyList).strip()

    print("this is response ip:" + proxy)

    # 设置新的代理ip内容

    request.mete['proxy'] = proxy

    return request

    return response

    复制代码

    每个 Downloader Middleware 定义了一个或多个方法的类,核心的方法有如下三个:

    process_request(request, spider)

    process_response(request,response, spider)

    process_exception(request, exception, spider)

    然后找到 setting.py 文件中的这块区域

    修改如下,也就是取消注释,加上刚刚写的Middleware 类的路径

    以上就已经配置好了一个简单的代理ip,此时来到 httpProxyIp.py 这个文件, 这个文件是我通过命令 scrapy genspider httpProxyIp icanhazip.com 生成的,创建成功内容如下:

    # -*- coding: utf-8 -*-

    import scrapy

    class HttpproxyipSpider(scrapy.Spider):

    name = 'httpProxyIp'

    allowed_domains = ['icanhazip.com']

    start_urls = ['http://icanhazip.com/']

    def parse(self, response):

    pass

    复制代码

    我们修改一下,最终代码如下所示:

    # -*- coding: utf-8 -*-

    import scrapy

    from scrapy.cmdline import execute

    class HttpproxyipSpider(scrapy.Spider):

    # spider 任务名

    name = 'httpProxyIp'

    # 允许访问的域名

    allowed_domains = ['icanhazip.com']

    # 起始爬取的url

    start_urls = ['http://icanhazip.com/']

    # spider 爬虫解析的方法,关于内容的解析都在这里完成; self表示实例的引用, response爬虫的结果

    def parse(self, response):

    print('代理后的ip: ', response.text)

    # 这个是main函数也是整个程序入口的惯用写法

    if __name__ == '__main__':

    execute(['scrapy', 'crawl', 'httpbin'])

    复制代码

    此时运行程序 scrapy crawl httpProxyIp 可以看到结果输出

    很明显,这里没有打印出我们想要的结果,说明之前 proxyList = ['http://218.75.158.153:3128','http://188.226.141.61:8080'] (代码展示,并不是推广网址,请官方核准)没有用,我们找找有没有可以用的,这里用免费的,所以找起来费点时间 免费代理ip

    这样就完成了scrapy的代理设置和验证调试。

    如何配置动态的代理ip

    这里使用的是收费的代理ip了,你可以使用快代理或者阿布云等云服务商提供的服务,当你注册并缴费之后,会给你一个访问url和用户名密码,这里直接看代码吧! 同样在 middlewares.py新建一个类

    修改 setting.py 的 DOWNLOADER_MIDDLEWARES 内容

    DOWNLOADER_MIDDLEWARES = {

    # 注释掉之前的例子改用AbuyunProxyMiddleware

    # 'scrapydownloadertest.middlewares.SimpleProxyMiddleware': 100,

    'scrapydownloadertest.middlewares.AbuyunProxyMiddleware': 100,

    }

    复制代码

    其他地方不动,我们在启动看看,这里换种启动方式,因为使用的是PyCharm开发工具,所以可以直接

    http://icanhazip.com/

    是一个显示当前访问者ip的网站,可以很方便的用来验证scrapy的代理ip 设置是否成功。

    文章到这技术了,喜欢的给小编点个关注。蟹蟹你们!

    相关文章

      网友评论

          本文标题:阿里大牛亲授,用Python爬虫Scrapy框架IP代理的配置与

          本文链接:https://www.haomeiwen.com/subject/azumohtx.html