一、前言
在使用爬虫的时候,很多网站都有一定的反爬措施,甚至在爬取大量的数据或者频繁地访问该网站多次时还可能面临ip被禁,所以这个时候我们通常就可以找一些代理ip,和不用的浏览器来继续爬虫测试。下面就开始来简单地介绍一下User-Agent池和免费代理ip池。
二、User-Agent池
User-Agent 就是用户代理,又叫报头,是一串字符串,相当于浏览器的身份证号,我们在利用python发送请求的时候,默认为: python-requests/2.22.0,所以我们在利用爬虫爬取网站数据时,频繁更换它可以避免触发相应的反爬机制。
构建User-Agent池,这里介绍两种方法:1,手动构造随机函数。2,第三方库fake-useragent
方法1:构造随机函数
自己手动编写User-Agent池,然后随机获取其中一个就行了。
def get_ua():
import random
user_agents = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
'Opera/8.0 (Windows NT 5.1; U; en)',
'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 ',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0) ',
]
user_agent = random.choice(user_agents)
return user_agent
get_ua()
至于,在哪里找这些浏览器,网上一大堆,复制过来即可。
实际环境调用随机User-Agent池
import requests
def get_page(url):
ua = get_ua()
headers = {'User-Agent': ua}
response = requests.get(url=url, headers=headers)
print(response.text)
if __name__ == '__main__':
get_page('https://www.baidu.com')
方法2: fake-useragent 库自动生成
注: 此库在2018年已经停止更新,版本目前停止在0.1.11,所以生成的浏览器版本都比较低。如果有网站检测浏览器版本号大小(范围)的话,就可能被检测到。
安装:
pip install fake-useragent
调用第三方库,生成指定浏览器的user-agent
from fake_useragent import UserAgent
ua = UserAgent()
ua.ie
ua.msie
ua['Internet Explorer']
ua.opera
ua.chrome
ua.google
ua['google chrome']
ua.firefox
ua.ff
ua.safari
ua.random
官方文档:https://fake-useragent.readthedocs.io/en/latest/
实际示例代码:
from fake_useragent import UserAgent
import requests
ua=UserAgent()
url="http://www.baidu.com"
headers={"User-Agent":ua.random}
response=requests.get(url=url,headers=headers)
print(response.text)
print(response.status_code)
print(response.headers)
三、IP代理池
开源IP代理池,这里推荐两个: https://github.com/Python3WebSpider/ProxyPool
https://github.com/jhao104/proxy_pool
这里用第二个测试,使用人数更多,而且一直在更新。
1:下载启动
Linux下载
git clone git@github.com:jhao104/proxy_pool.git
git clone https://github.com/jhao104/proxy_pool.git
使用docker compose启动
cd proxy_pool/
docker compose up -d
启动web服务后, 默认配置下会开启 http://127.0.0.1:5010 的api接口服务:
api:
- /get :GET, 随机获取一个代理 ,可选参数: ?type=https 过滤支持https的代理
- /pop :GET, 获取并删除一个代理, 可选参数: ?type=https 过滤支持https的代理
- /all :GET, 获取所有代理 ,可选参数: ?type=https 过滤支持https的代理
- /count :GET, 查看代理数量,
- /delete :GET, 删除代理, ?proxy=host:ip
访问浏览器测试,我这里IP,192.168.152.100
2:爬虫使用
如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5010/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))
def getHtml():
retry_count = 5
proxy = get_proxy().get("proxy")
while retry_count > 0:
try:
html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
return html
except Exception:
retry_count -= 1
delete_proxy(proxy)
return None
更多使用方法,参考官方文档:https://proxy-pool.readthedocs.io/zh/latest/
以上是基本使用方法,都是免费的,质量也有限
|