当你经常爬取对方的网站,对方看你,呦这家伙频繁访问也太快了吧,肯定是个爬爬,得把他的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 窗口,然后在命令行输入命令。

python伪造请求头 python伪装ip_IP

第二步,运行run.py

步骤,直接在Windows PS窗口进行运行,

输入命令python run.py

python伪造请求头 python伪装ip_python伪造请求头_02


项目跑起来后,不要关闭该窗口,然后接下来你就可以访问你的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来爬取京东的商品图片:

python伪造请求头 python伪装ip_proxy_03


源代码如下:

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)