day71-代理ip的使用

1代理ip

在爬取网页过程中,经常遇到爬取次数过于频繁而被封ip地址,这个时候想要再次爬取就要使用代理ip来爬取网页。

import time
from bs4 import BeautifulSoup
from lxml import etree
from selenium import webdriver
import re


# 获得一组可能可用的代理ip地址
def getproxy():
    # 目标地址
    target_url = "http://www.goubanjia.com/"
    # 使用谷歌浏览器
    chrome_options = webdriver.ChromeOptions()
    # 无头浏览器
    chrome_options.add_argument('--headless')
    # driver = webdriver.Chrome(r'C:\Users\16957\AppData\Local\Google\Chrome\Application\chromedriver.exe')
    driver = webdriver.Chrome(chrome_options=chrome_options)
    # 等待js加载
    time.sleep(1)
    # 访问地址
    driver.get(target_url)
    # 得到html文件
    target_html = driver.page_source
    # 建立bs对象
    bs = BeautifulSoup(target_html, 'html.parser')
    # 找到了20个存放地址的td标签
    rst_etree = bs.find_all(attrs={'class': 'ip'})
    index = 0
    addr_list = []
    # 遍历每一个td
    while index < len(rst_etree):
        rst_etree[index] = str(rst_etree[index])
        # 用l存放所有网页分析干扰项的p标签
        list_p = re.compile(r'<p.*?>[^<]*?</p>').findall(rst_etree[index])
        # 将所有p标签替换为空字符
        for item in list_p:
            rst_etree[index] = rst_etree[index].replace(item, "")
        # 通过etree里的xpath中的string方法获得ip地址
        dom = etree.HTML(rst_etree[index])
        ip_addr = ''
        ip_addr += dom.xpath("string(.)")
        addr_list.append(ip_addr)
        index += 1
    # 得到最新的代理ip列表
    return addr_list        
def check_ip(ip_list=[]):
    # 使用request验证ip可用性
    import requests
    for item in ip_list:
        proxies = {
            "http": item,
            "https": item
        }
        # 如果连接成功,且返回来内容认为ip可用,返回该ip退出循环
        try:
            rsp = requests.get("http://www.baidu.com", proxies=proxies)
            if rsp.text is not None:
                return item
                # break
        except Exception:
            pass
    # 如果20个遍历完没找到可用的ip,返回none
    return None        
# 得到一个可用的ip地址
# 这个函数在其他地方导入该模块并且执行该函数就会返回一个可用的ip地址
def get_one_proxy_ip():
    ip_list = getproxy()
    if check_ip(ip_list) is not None:
        return check_ip(ip_list)
    else:
        return None        
if __name__ == '__main__':
    print(get_one_proxy_ip())

2代理ip的使用

代理ip在scrapy框架中主要应用在中间件middleware中

class ProxyMiddleware():        
    def process_request(self, request, spider):
        proxy = get_one_proxy_ip()
        if proxy:
            uri = 'http://%s' % proxy
            print('-' * 20)
            print(uri)
            request.meta['proxy'] = uri

并将中间键添加到settings中

DOWNLOADER_MIDDLEWARES = {
   'zhancool.middlewares.ProxyMiddleware': 543,
}

3自动筛选可用免费代理ip的使用方法

1.打开ProxyPool-master文件夹中的所有文件;
2.运行redis-server应用
3.安装requirement.txt文件中的所有依赖库;直接运行run文件,会自动捕获ip并检测其可用性
4.打开http://127.0.0.1:5555/random
这个时候页面将会展示一个可用的代理ip;同时程序运行软件可能也会报错,不用理会报错,让它继续运行,就可以自动爬取代理ip,并自动检测其是否可用,并会删除代理池中不可用的代理ip
5.将ProxyPool-master文件夹下的proxy_helper.py文件复制到项目中需要使用代理ip的文件的同级文件夹下
6.将以下代码添加到scrapy项目的middleware中

class ProxyMiddleware():
    
    def process_request(self, request, spider):
        proxy = get_proxy_ip_from_pool()
        if proxy:
            uri = 'http://%s' % proxy
            print('-' * 20)
            print(uri)
            request.meta['proxy'] = uri

7.在settings中配置以下代码

DOWNLOADER_MIDDLEWARES = {
    'zhancool.middlewares.ProxyMiddleware': 543,
}

上述配置配置好后,运行爬虫就会自动使用代理ip爬取

4付费代理使用方法

4.1获取代理ip

import json
import random
import requests

def get_proxy_ip_from_pool():
    url = 'http://127.0.0.1:5555/random'

    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        # print(response.text)
        return response.text
    return None


def get_proxy_ip():
    url = 'http://piping.mogumiao.com/proxy/api/get_ip_bs?appKey=72a2b845b4114d05aa77d110e9b97e03&count=20&expiryDate=0&format=1&newLine=2'

    headers = {
        "User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)"
    }
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        # print(response.text)
        json_data = json.loads(response.text)
        ip_list = json_data['msg']
        ip_dict = random.choice(ip_list)

        return ip_dict
    return None


if __name__ == '__main__':
    ip = get_proxy_ip()
    print(ip)

4.2使用代理ip

将以下代码添加到scrapy项目的middleware中

class ProxyMiddleware():        
    def process_request(self, request, spider):
        proxy = get_proxy_ip_from_pool()
        if proxy:
            uri = 'http://%s' % proxy
            print('-' * 20)
            print(uri)
            request.meta['proxy'] = uri

在settings中配置以下代码

DOWNLOADER_MIDDLEWARES = {
    'zhancool.middlewares.ProxyMiddleware': 543,
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 部门(东方IC、图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权。前期主要用node做爬虫...
    字节跳动技术团队阅读 7,786评论 1 67
  • 人类最伟大的事就是做生意,听到一半我才发现去年就看完了这本书。 1.跟客户没有建立连接 2.急于让步 3.找不到决...
    奇怪奇怪是我阅读 1,466评论 0 1
  • “我会住在其中的一颗星星上面,在某一颗星星上微笑着。每当夜晚你仰望星空的时候,就会像是看到所有的星星都在微笑一...
    仝珍珍阅读 217评论 0 1
  • 夏渐远风吹,红花绿叶衰。 百花残一地,枫叶谢相随。 萧瑟梧桐雨,霖铃独自悲。 有情人不忍,心碎泪低垂。
    鱼泡泡儿阅读 197评论 0 3