# -*- coding:utf-8 -*-
import requests
import pymysql
from fake_useragent import UserAgent
# Selector 引入
from scrapy.selector import Selector
'''
1.爬虫每次发起请求需要从代理池中提取一个可用代理,如果提取的代理不可用,从代理池中删除
2.当代理池中的代理少于某个程度,需要重新爬取一部分代理,添加到代理池中
'''
ua = UserAgent()
conn = pymysql.connect(
host= '127.0.0.1',
user= 'root',
password='123456',
db = 'ipdb',
port=3306
)
cursor = conn.cursor()
def crawler_ip(url):
# 准备请求头
headers = {
'User-Agent':ua.random,
'Host':'www.xicidaili.com'
}
response = requests.get(url=url,headers=headers)
# 正则 bs4 xpath
# 根据返回的数据创建Selector对象
selector =Selector(text=response.text)
# 通过xpath查找数据
trs = selector.xpath("//table[@id='ip_list']/tr")
for tr in trs[1:]:
ip = tr.xpath('td[2]/text()').extract_first('')
port = tr.xpath('td[3]/text()').extract_first('')
life_time = tr.xpath('td[9]/text()').extract_first('')
ip_type = tr.xpath('td[6]/text()').extract_first('')
if '分钟' not in life_time:
# 将ip和端口插入数据
insert_ip(ip,port,ip_type)
def insert_ip(ip,port,ip_type):
# 1.根据ip查询数据,如果查询有结果说明数据库中已经有这个信息
sql = "SELECT * FROM iptable WHERE ip='%s'"%ip
res = cursor.execute(sql)
if res != 0:
print('该ip已存在!')
return
# 插入数据之前,需要判断ip是否已经存在,如果已经存在,就不用再次插入数据
sql = "INSERT INTO iptable VALUES('%s','%s','%s')"%(ip,port,ip_type)
cursor.execute(sql)
conn.commit()
# 获取可用的ip
def get_random_ip():
# 获取ip之前,判断ip个数
sql = "SELECT * FROM iptable"
rs = cursor.execute(sql)
if rs < 20:
# 重新获取一次
ip_request()
# 随机从数据库中取出一条数据
sql = "SELECT * FROM iptable ORDER BY RAND() LIMIT 1"
cursor.execute(sql)
rs = cursor.fetchone()
# 取出ip信息
ip = rs[0]
port = rs[1]
ip_type = rs[2]
# 测试这个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)
except Exception as e:
print(ip,'不可用!')
# 删除该ip
delete_ip(ip)
# 重新获取一个ip
get_random_ip()
else:
return '{}:{}'.format(ip,port)
def delete_ip(ip):
sql = "DELETE FROM iptable WHERE ip='%s'"%ip
cursor.execute(sql)
conn.commit()
# 获取ip的请求函数
def ip_request():
for x in range(1, 6):
print('正在获取第%s页ip' % x)
# 拼接地址
url = 'http://www.xicidaili.com/nn/%s' % x
crawler_ip(url)
if __name__ == '__main__':
ip = get_random_ip()
print(ip)
import requests
import pymysql
from fake_useragent import UserAgent
# Selector 引入
from scrapy.selector import Selector
'''
1.爬虫每次发起请求需要从代理池中提取一个可用代理,如果提取的代理不可用,从代理池中删除
2.当代理池中的代理少于某个程度,需要重新爬取一部分代理,添加到代理池中
'''
ua = UserAgent()
conn = pymysql.connect(
host= '127.0.0.1',
user= 'root',
password='123456',
db = 'ipdb',
port=3306
)
cursor = conn.cursor()
def crawler_ip(url):
# 准备请求头
headers = {
'User-Agent':ua.random,
'Host':'www.xicidaili.com'
}
response = requests.get(url=url,headers=headers)
# 正则 bs4 xpath
# 根据返回的数据创建Selector对象
selector =Selector(text=response.text)
# 通过xpath查找数据
trs = selector.xpath("//table[@id='ip_list']/tr")
for tr in trs[1:]:
ip = tr.xpath('td[2]/text()').extract_first('')
port = tr.xpath('td[3]/text()').extract_first('')
life_time = tr.xpath('td[9]/text()').extract_first('')
ip_type = tr.xpath('td[6]/text()').extract_first('')
if '分钟' not in life_time:
# 将ip和端口插入数据
insert_ip(ip,port,ip_type)
def insert_ip(ip,port,ip_type):
# 1.根据ip查询数据,如果查询有结果说明数据库中已经有这个信息
sql = "SELECT * FROM iptable WHERE ip='%s'"%ip
res = cursor.execute(sql)
if res != 0:
print('该ip已存在!')
return
# 插入数据之前,需要判断ip是否已经存在,如果已经存在,就不用再次插入数据
sql = "INSERT INTO iptable VALUES('%s','%s','%s')"%(ip,port,ip_type)
cursor.execute(sql)
conn.commit()
# 获取可用的ip
def get_random_ip():
# 获取ip之前,判断ip个数
sql = "SELECT * FROM iptable"
rs = cursor.execute(sql)
if rs < 20:
# 重新获取一次
ip_request()
# 随机从数据库中取出一条数据
sql = "SELECT * FROM iptable ORDER BY RAND() LIMIT 1"
cursor.execute(sql)
rs = cursor.fetchone()
# 取出ip信息
ip = rs[0]
port = rs[1]
ip_type = rs[2]
# 测试这个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)
except Exception as e:
print(ip,'不可用!')
# 删除该ip
delete_ip(ip)
# 重新获取一个ip
get_random_ip()
else:
return '{}:{}'.format(ip,port)
def delete_ip(ip):
sql = "DELETE FROM iptable WHERE ip='%s'"%ip
cursor.execute(sql)
conn.commit()
# 获取ip的请求函数
def ip_request():
for x in range(1, 6):
print('正在获取第%s页ip' % x)
# 拼接地址
url = 'http://www.xicidaili.com/nn/%s' % x
crawler_ip(url)
if __name__ == '__main__':
ip = get_random_ip()
print(ip)