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'[^<]*?').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,
}