当你经常爬取对方的网站,对方看你,呦这家伙频繁访问也太快了吧,肯定是个爬爬,得把他的IP封了,看他还怎么爬!
因此,这次教你怎么伪装自己的 IP 地址别让对方轻易的就把你给封掉。
那怎么伪装呢?
那接下来就是学习Python的正确姿势了!
其实对于Python来说,使用代理代理IP访问是很简单的。就拿我们经常使用的requests库来说,使用代理IP如下:
import requests
#定义代理IP
proxie = {
'http' : 'http://xx.xxx.xxx.xxx:xxxx',
'http' : 'http://xxx.xx.xx.xxx:xxx',
....
}
#使用代理IP
response = requests.get(url,proxies=proxies)
这样你就能使用代理IP去访问网站了,当然了,你会问我代理IP在哪?哪里来?
在网上有很多的免费的代理IP,一搜就是一大堆。
当然了你也知道,既然是免费的,肯定也有很多人去使用,而且也不稳定。
如果你有钱的话,市面上有人就专门提供代理IP的直接去买就行了。(真有钱,真是的爬个虫也得这样,也带带我~)
当然了我们的重点就是白嫖,不花钱了。
那么接下来就是重点了,开始真正的学习Python正确姿势了!
不想花钱?那我们可以搞个IP代理池!
道理呢大家都懂:
主要就是通过 python 程序去抓取网上大量免费的代理 ip ,然后定时的去检测这些 ip 可不可以用,那么下次你要使用代理 ip 的时候,你只需要去自己的 ip 代理池里面拿就行了。
现在的你是不是心痒痒的也想弄一个代理池了,当然了你也得有这个水平。哈哈
所以我现在推荐一个不错的开源的IP代理池
https://github.com/Python3WebSpider/ProxyPool
然后将它下载到本地就好。
接下来如果你需要配置一些相关信息,可以到它的proxypool目录下的setting.py里设置,比如Redis 的地址密码相关。
如果你没有Redis,那么你得快去下载了。这是必须需要的。下载地址请看下面:
https://github.com/MicrosoftArchive/redis/releases
前提Redis 安装完后,进行以下步骤
然后接下来找到你下载好的IP代理池文件夹,
第一步:安装上依赖包
pip install -r requirements.txt
步骤如下:
Shift+鼠标右键,选Windows PowerShell 窗口,然后在命令行输入命令。
第二步,运行run.py
步骤,直接在Windows PS窗口进行运行,
输入命令python run.py
项目跑起来后,不要关闭该窗口,然后接下来你就可以访问你的ip代理池了。
比如随机获取一个代理 ip 地址
http://localhost:5555/random
这样访问可以随机获取一个代理ip。
有了这样的条件,在代码中也不难实现:
import requests
PROXY_POOL_URL = 'http://localhost:5555/random'
def get_proxy():
try:
response = requests.get(PROXY_POOL_URL)
if response.status_code == 200:
return response.text # 如果该代理ip可用,返回该代理ip
except ConnectionError:
return None
这样我们就成功的在我们的代理池中获取代理 ip 了,那么下次谁还敢封你ip,你就拿出你的代理ip,继续爬,嘿嘿~
下面我给大家一个简单的实例来展现一下秀操作了.
通过代理ip来爬取京东的商品图片:
源代码如下:
import re
import os
from urllib import request
import requests
PROXY_POOL_URL = 'http://localhost:5555/random'
def get_proxy():
try:
response = requests.get(PROXY_POOL_URL)
if response.status_code == 200:
return response.text
except ConnectionError:
return None
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/63.0.3239.132 Safari/537.36',
'upgrade-insecure-requests': '1',
}
def gethtml(url):
proxy = get_proxy()
proxies = {'http': 'http://' + proxy}
response = requests.get(url, headers = headers, proxies=proxies)
html = response.text
return html
def geturllist(html):
pattern = re.compile(r'data-lazy-img="//(.+?\.jpg)"',re.M)
imglist = re.findall(pattern, html)
return imglist
def downloadimgs(urllist):
if not os.path.exists('pictures'):
os.mkdir('pictures')
x=1
print('开始下载,共{count}张图片。'.format(count=len(urllist)))
for imgurl in urllist:
print('第{count}张图片。'.format(count=x))
imgurl = "http://" + imgurl
request.urlretrieve(imgurl,os.path.join('pictures','{num}.jpg'.format(num=x)))
x+=1
print('下载完成!')
if __name__=='__main__':
url = 'https://search.jd.com/Search?keyword=cpu&enc=utf-8&wq=cpu&pvid=2fc2be2e40ba471399e67b5bbb0b82f2'
html=gethtml(url)
urllist=geturllist(html)
downloadimgs(urllist)