随着我们爬虫的速度越来越快,很多时候,有人发现,数据爬不了啦,打印出来一看。

不返回数据,而且还甩一句话

是不是很熟悉啊?

要想想看,人是怎么访问网站的? 发请求,对,那么就会带有

request.headers,

那么当你疯狂请求别人的网站时候,人家网站的管理人员就会 觉得有点不对劲了,

他看看请求的 header 信息,一看吓一跳,结果看到的 headers 信息是这样的:

Host: 127.0.0.1:3369
User-Agent: python-requests/3.21.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: keep-alive

看到:

User-Agent: python-requests/3.21.0

居然使用 python 的库来请求,说明你已经暴露了,人家不封你才怪呢?

那么怎么办呢?伪装自己呗。

python 不可以伪装,浏览器可以伪装,所以可以修改浏览器的请求头。

简单来说,就是让自己的 python 爬虫假装是浏览器。

  1. 伪装 Header的哪个地方?
    要让自己的 python 爬虫假装是浏览器,我们要伪装headers,那么headers里面有很多字段,我们主要注意那几个呢?

headers数据通常用这两个即可,强烈推荐在爬虫中为每个request都配个user-agent,而’Referer’如果需要就加,不需要就不用。(Referer是什么?后面补充知识点)

图示:

上面几个重要点解释如下:

Requests Headers:
• “吾是人!”——修改user-agent:里面储存的是系统和浏览器的型号版本,通过修改它来假装自己是人。

• “我从台湾省来”——修改referer:告诉服务器你是通过哪个网址点进来的而不是凭空出现的,有些网站会检查。

• “饼干!”:——带上cookie,有时带不带饼干得到的结果是不同的,试着带饼干去“贿赂”服务器让她给你完整的信息。
3.headers的伪装—随机User-Agent
爬虫机制:很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)

随机User-Agent生成 :生成一个随机的User-Agent,这样你就可以是很多不同的浏览器模样。

(代码现成的,复制拿去用即可)

#!/usr/bin/python3#@Readme : 反爬之headers的伪装# 对于检测Headers的反爬虫
from fake_useragent import UserAgent   # 下载:pip install fake-useragent ua = UserAgent()        # 实例化,需要联网但是网站不太稳定-可能耗时会长一些# 1.生成指定浏览器的请求头
print(ua.ie)
print(ua.opera)
print(ua.chrome)
print(ua.google)
print(ua.firefox)
print(ua.safari)
# 随机打印一个浏览器的User-Agent
print(ua.random)
print('完毕。')# 2.在工作中常用的则是ua.random方式
import requests
ua = UserAgent()
print(ua.random)  # 随机产生headers = {'User-Agent': ua.random    # 伪装}# 请求
url = 'https://www.baidu.com/'
response = requests.get(url, headers=headers)
print(response.status_code)

Referer的伪装:

如果想爬图片,图片反盗链的话就要用到Referer了。
headers = {‘User-Agent’:ua.random,‘Referer’:‘这里放入图片的主页面’}
如果遇到防盗链的图片,一般思路就是先爬到所有图片的地址.jpg —–>将它们储存在列表中 —–>遍历访问图片地址,然后用 ‘wb’的格式打开文件写入,文件名根据图片地址动态改变。

这个基本上如果你的爬虫对象不是很严肃的图片网站,都不会用到。

4.2.1 自建的ip代理池

多线程爬虫
就是自己去收集网上公开的免费ip,自建起 自己的ip代理池。
就是通过 python 程序去抓取网上大量免费的代理 ip , 然后定时的去检测这些 ip 可不可以用,那么下次你要使用代理 ip 的时候,你只需要去自己的 ip 代理池里面拿就行了。
简单来说:访问免费代理的网站 —> 正则/xpath提取 ip和端口—> 测试ip是否可用 》》可用则保存 》》使用ip爬虫 > 过期,抛弃ip。

这个过程可以使用多线程或异步的方式,因为检测代理是个很慢的过程。

这是来源于网络的一个西刺代理的多线程ip代理爬虫:(我不用)

#!/usr/bin/python3#@Readme : IP代理==模拟一个ip地址去访问某个网站(爬的次数太多,ip被屏蔽)# 多线程的方式构造ip代理池。
from bs4 import BeautifulSoup
import requests
from urllib import request, error
import threadingimport os
from fake_useragent import UserAgentinFile = open('proxy.txt')           # 存放爬虫下来的ip
verifiedtxt = open('verified.txt')  # 存放已证实的可用的iplock = threading.Lock()def getProxy(url):# 打开我们创建的txt文件proxyFile = open('proxy.txt', 'a')# 伪装ua = UserAgent()headers = {'User-Agent': ua.random}# page是我们需要获取多少页的ip,这里我们获取到第9页for page in range(1, 10):# 通过观察URL,我们发现原网址+页码就是我们需要的网址了,这里的page需要转换成str类型urls = url + str(page)# 通过requests来获取网页源码rsp = requests.get(urls, headers=headers)html = rsp.text# 通过BeautifulSoup,来解析html页面soup = BeautifulSoup(html,'html.parser')# 通过分析我们发现数据在 id为ip_list的table标签中的tr标签中trs = soup.find('table', id='ip_list').find_all('tr')  # 这里获得的是一个list列表# 我们循环这个列表for item in trs[1:]:# 并至少出每个tr中的所有td标签tds = item.find_all('td')# 我们会发现有些img标签里面是空的,所以这里我们需要加一个判断if tds[0].find('img') is None:nation = '未知'locate = '未知'else:nation = tds[0].find('img')['alt'].strip()locate = tds[3].text.strip()# 通过td列表里面的数据,我们分别把它们提取出来ip = tds[1].text.strip()port = tds[2].text.strip()anony = tds[4].text.strip()protocol = tds[5].text.strip()speed = tds[6].find('div')['title'].strip()time = tds[8].text.strip()# 将获取到的数据按照规定格式写入txt文本中,这样方便我们获取proxyFile.write('%s|%s|%s|%s|%s|%s|%s|%s\n' % (nation, ip, port, locate, anony, protocol, speed, time))def verifyProxyList():verifiedFile = open('verified.txt', 'a')while True:lock.acquire()ll = inFile.readline().strip()lock.release()if len(ll) == 0: breakline = ll.strip().split('|')ip = line[1]port = line[2]realip = ip + ':' + portcode = verifyProxy(realip)if code == 200:lock.acquire()print("---Success成功:" + ip + ":" + port)verifiedFile.write(ll + "\n")lock.release()else:print("---Failure失败:" + ip + ":" + port)def verifyProxy(ip):'''验证代理的有效性'''ua = UserAgent()requestHeader = {'User-Agent': ua.random}url = "http://www.baidu.com"# 填写代理地址proxy = {'http': ip}# 创建proxyHandlerproxy_handler = request.ProxyHandler(proxy)# 创建openerproxy_opener = request.build_opener(proxy_handler)# 安装openerrequest.install_opener(proxy_opener)try:req = request.Request(url, headers=requestHeader)rsq = request.urlopen(req, timeout=5.0)code = rsq.getcode()return codeexcept error.URLError as e:return eif __name__ == '__main__':# 手动新建两个文件filename = 'proxy.txt'filename2 = 'verified.txt'if not os.path.isfile(filename):inFile = open(filename, mode="w", encoding="utf-8")if not os.path.isfile(filename2):verifiedtxt = open(filename2, mode="w", encoding="utf-8")tmp = open('proxy.txt', 'w')tmp.write("")tmp.close()tmp1 = open('verified.txt', 'w')tmp1.write("")tmp1.close()# 多线程爬虫西刺代理网,找可用ipgetProxy("http://www.xicidaili.com/nn/")getProxy("http://www.xicidaili.com/nt/")getProxy("http://www.xicidaili.com/wn/")getProxy("http://www.xicidaili.com/wt/")all_thread = []for i in range(30):t = threading.Thread(target=verifyProxyList)all_thread.append(t)t.start()for t in all_thread:t.join()inFile.close()verifiedtxt.close()

运行一下,效果:

爬出来的可用的很少或者很短:

重点来了!!!!!!!!!

4.2.3 开源 ip代理池—ProxyPool(吐血推荐)
类比线程池,进程池,懂了吧?
这是俺发现的一个不错的开源 ip 代理池ProxyPool,可以用windows系统的,至少Python3.5以上环境哟,还需要将Redis服务开启。

现成的代理池,还不用起来?

ProxyPool下载地址:

https://github.com/Python3WebSpider/ProxyPool.git

(可以手动下载也可以使用git下来。)

1.ProxyPool的使用:

首先使用 git clone 将源代码拉到你本地,

3.进入proxypool目录,修改settings.py文件,PASSWORD为Redis密码,如果为空,则设置为None。(新装的redis一般没有密码。)

(如果你没 redis 的话,可以先去下载了安装了再来看吧。)

(假设你的redis已经安装完成。)

4.接着在你 clone 下来的文件目录中(就是这个ProxyPool存的电脑路径 )

5.安装相关所需的 依赖包:
(pip或pip3)

pip install -r requirements.txt

(如果你把ProxyPool导入在pycharm里面,那就一切都在pycharm里面搞就可以了。

6.接下来开启你的 redis服务,

直接cmd 打开dos窗口,运行:redis-server.exe
即可开启redis服务器。redis 的默认端口就是 6379

7.接着就可以运行 run.py 了。

可以在cmd里面命令方式运行,也可以导入pycharm里面运行。

图示:

8.运行 run.py 以后,你可以打开你的redis管理工具,或者进入redis里面查看,这时候在你的 redis 中就会存入很多已经爬取到的代理 ip 了:

9.项目跑起来之后,【不要停止】,此时redis里面存了ip,就可以访问这个代理池了。

在上面的图中,可以看到有这么一句话

Running on http://0.0.0.0:5555/ (Press CTRL+C to quit)
这就是告诉我们随机访问地址URL是多少。
10.在浏览器中随机获取一个代理 ip 地址:

你就浏览器输入:

http://0.0.0.0:5555/random


11.在代码中随机获取一个ip代理

就这样:

import requests
# 随机ip代理获取
PROXY_POOL_URL = 'http://localhost:5555/random'
def get_proxy():try:response = requests.get(PROXY_POOL_URL)if response.status_code == 200:return response.textexcept ConnectionError:return Noneif __name__ == '__main__':print(get_proxy())


好了。到此结束了。

使用这个 ip代理池,目前来说是最好的了,又免费又高效唉~~~

5.报错解决
安装的时候,如果报错类似于如下:

AttributeError: ‘int’ object has no attribute 'items

更新一下 对应的xxx软件版本,比如redis 版本:

pip install redis==3.33.1

最后给一个Redis Desktop Manager安装教程:

Redis 服务安装与配置

1.下载解压

先下载Redis:

https://github.com/ServiceStack/redis-windows/tree/master/downloads


下载完后解压到任意路径下(我的是D:\SoftWare\Redis-3.0)

2.启动redis服务器

进入解压后的文件夹,然后运行redis-server.exe文件。
  
  
   注意:该窗口不可关闭,否则,Redis服务不可用!

现在再从Redis Desktop Manager进行连接就可以成功了!
  
  3.启动redis客户端

直接双击D:\SoftWare\Redis-3.0目录下的redis-cli.exe文件(redis客户端),如果显示127.0.0.1:6379> ,就说明客户端运行成功。
  
  4.修改密码

redis默认是空密码,但是这样在项目上线后是不安全的,容易被入侵,所以要设置密码。

1)打开redis.windows.conf文件,找到# requirepass foobared 这行,在此行下增加一行requirepass 所设置的密码 ,保存。

//此处注意,密码自定义就行,并且行前不能有空格!

2)打开cmd(windows命令窗口),切换到redis-server.exe目录下。

3)输入命令:redis-server.exe redis.windows.conf启动redis,即可使用密码了。


4)客户端测试:

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> auth redis                              //会报以下错误
(error) ERR Client sent AUTH, but no password is set
127.0.0.1:6379> CONFIG SET requirepass "redis"          //执行此行指令即可解决错误
OK
127.0.0.1:6379> auth redis
OK

5.将Redis服务安装到本地服务

由于上述启动Redis服务器的方式有点复杂,且redis服务窗口不可关闭。故这里介绍如何将Redis服务安装到Windows系统的本地服务。

在cmd下输入以下命令:

redis-server --service-install redis.conf --loglevel verbose    //安装redis本地服务,指定配置文件redis.windows.conf


6.如何卸载Redis本地服务

打开win系统命令行,依次输入下列命令:

C:\Users\lenovo>cd /d D:

D:>cd D:\SoftWare\Redis-3.0

D:\SoftWare\Redis-3.0> redis-server --service-uninstall

教你自己搭建一个ip池(绝对超好用!!!!)相关推荐

  1. 如何搭建动态IP池?手把手教你3种方法!

    动态IP是什么?在当今互联网中,人人都需要访问网络来获取资讯解决工作和学习生活的需求,而网络中的黑客也越来越多,稍不留意就会在网络中留下自己的痕迹.在这种情况下,动态IP的使用就非常有必要了. 另外很 ...

  2. Python搭建代理IP池(一)- 获取 IP

    使用爬虫时,大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉.对于访问速度的处理比较简单,只要间隔一段时间爬取一次就行了,避免频繁访问 ...

  3. 搭建代理IP池的方法

    突破次数的限制就可以使爬虫更高效的工作,代理IP是突破次数限制,提高爬虫高效工作的最好的工具.所以,很多人都想通过建立IP池的方法,实现换IP突破限制,那么这IP池如何进行搭建呢? 一,免费搭建代理I ...

  4. 利用多线程爬虫搭建代理ip池的两种方法(含源码)

    搭建爬虫代理ip池的两种方法(含源码) 前言 一.ip池是什么? 二.爬取原理 三.使用步骤 方法一 爬取网站https://www.kuaidaili.com/ 验证 存取到mysql 方法二 爬取 ...

  5. Python搭建代理IP池(三)- 检测 IP

    在获取 IP 时,已经成功将各个网站的代理 IP 获取下来了,然后就需要一个检测模块来对所有的代理进行一轮轮的检测,检测可用就设置为满分,不可用分数就减 1,这样就可以实时改变每个代理的可用情况,在获 ...

  6. python反爬虫应对措施之搭建代理IP池

    通过网络访问服务器时,服务器端会通过IP地址知道是谁来对其进行访问,我们在爬虫过程中,如果经常使用一个IP地址对同一个URL进行访问,此IP很有可能被服务器拉入黑名单,就访问不了此URL了,这是针对具 ...

  7. Python搭建代理IP池(二)- 存储 IP

    上一文写了如何从代理服务网站提取 IP,本文就讲解如何存储 IP,毕竟代理池还是要有一定量的 IP 数量才行.存储的方式有很多,直接一点的可以放在一个文本文件中,但操作起来不太灵活,而我选择的是 My ...

  8. 闲置硬盘自制nas私有云_家里闲置硬盘怎么办?教你自己搭建一个私人云盘!

    原标题:家里闲置硬盘怎么办?教你自己搭建一个私人云盘! 最近在家比较闲,把家里之前电脑硬盘升级到固态硬盘的那个500G的机械硬盘翻出来,看看如何利用起来,在家里放着也是浪费.因为有好多个人资源需要,但 ...

  9. 手把手教你如何搭建一个自己的安卓快速开发框架之带你做自己的APP(二)

    ####点击查看上一篇文章:手把手教你如何搭建一个自己的安卓快速开发框架之BaseActivity(一) 继上一篇我实现了基本的BaseActivity,包含 ToolBar 透明状态栏 生命周期监控 ...

  10. Python之爬虫 搭建代理ip池

    文章目录 前言 一.User-Agent 二.发送请求 三.解析数据 四.构建ip代理池,检测ip是否可用 五.完整代码 总结 前言 在使用爬虫的时候,很多网站都有一定的反爬措施,甚至在爬取大量的数据 ...

最新文章

  1. UI设计师培训入门都需要学习什么技术?
  2. javascript tab切换类LixTabs最新版
  3. VTK:vtkAffineWidget用法实战
  4. 黑苹果挂载不了分区_让黑苹果变得更完美——BCM94532HMB无线蓝牙接力完美驱动!...
  5. oracle安装必要的,CentOSOracle安装必要的软件创建数据库
  6. 2010年06月12日
  7. 利用结构体数组实现重排序(详解)
  8. 当null检查非常失败时
  9. leetcode(动态规划专题)
  10. --6、专业信息表(表)
  11. 最新微软Windows Server 2008之一 系统安装
  12. 【零基础 快速学Java】韩顺平 笔记整理(到p170 跑路了)
  13. 群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了
  14. 《Thinking in UML》学习1——参与者与用例
  15. 蔡颖-《APS走向实践》书解读之一:APS优化供应链从绩效指标开始
  16. 【计划表合集】学习计划表/时间表/打卡表/理财表/读书记录/生活计划表等合集
  17. XCTF final noxss
  18. C语言错题集(指针2020/12/8)
  19. Google Earth Engine(GEE)——GEE最全介绍(7000字长文)初学者福音!
  20. wiki语料库训练检索式聊天机器人

热门文章

  1. python hist2d_matplotlib可视化之hist直方图
  2. 一个简单的Mastermind Game
  3. SFF1006-ASEMI超快恢复二极管SFF1006
  4. 生活中的一些哲理名言
  5. 梦殇 chapter one
  6. 用74HC573进行LED数码管驱动的编程
  7. java abs是什么意思_Java abs()方法
  8. 优秀的免版权图库软件推荐,软件内图片均可免费商用。
  9. CREATE DATABASE 或 ALTER DATABASE 失败,因为结果数据库的累计大小将超出每 数据库 为 4096 MB 的
  10. 三位数的水仙花数有哪些?