您的位置:首页 > 其它

爬虫代理池

2018-03-21 20:54 176 查看
目的:
"""
1. 爬虫每次发起请求需要从代理池中提取一个可用代理, 如果提取的代理不可用, 从代理池中删除
2. 当代理池中的代理少于某个程度, 需要重新爬取一部分代理, 添加到代理池中
"""
用到的一些包(看个人需求)
import requests
# 连接数据库
import pymysql
# 第三方包的随机请求头
from fake_useragent import UserAgent
# 与 from lxml import etree 一样
from scrapy.selector import Selector

逻辑:
"""
1. 连接数据库, 获取游标
2. 准备请求头, 通过requests.get获得网页响应
3. 根据返回的数据创建Selector对象
selector = Selector(text=response.text)
4. 通过xpath查找数据(ip, port, life_time, ip_type)(因为免费的ip会有过期时间, 所以需要将过期时间较短的从中删除)
5. 根据ip查询数据, 如果查询有结果说明数据库中已经有这个信息
6. 插入数据之前, 需要判断ip是否已经存在, 如果已经存在, 就不用再次插入数据
7. 获取可用的ip, 获取可用ip之前, 判断ip个数, 这里设定一个范围如果ip个数小于多少时, 重新获取一次
8. 随机从数据库中取出一条数据, 这里是随机取出一行,需要执行完这条sql语句后加:
rs = cursor.fetchone()
# 取出ip信息
ip = rs[0]
port = rs[1]
ip_type = rs[2]
9. 测试这个ip是否有用, 这里可以使用:
try:
    proxy_dict={
            ip_type.lower():'{}://{}:{}'.format(ip_type.lower(), ip, port)}
    # requests使用代理发送请求

            response = requests.get('http://www.baidu.com', proxies=proxy_dict, timeout=0.5)

    # 这里设置延迟时间0.5秒, 检测这个ip能不能用. 我的想法是不仅能用而且要快, 当然这个时间可以进行你的需要来调整,但一般不超过2秒, 除非你是慢性子~~

except Exception as e:
            print(ip, '不可用')

            # 删除该ip

            delete_ip(ip)

            # 重新获取一个ip

else:
        return '{:}{}'.format(ip, port)
"""
注意: 写的可能不太详细, 但能通这个能明白大概逻辑就行, 如果想要源码可以留言 ! 博主爬取的是西刺
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IP代理 IP