上篇已经对数据进行了清洗,本篇对反爬虫做一些应对措施,主要包括随机UserAgent、随机代理。


一、随机UA

分析:构建随机UA可以采用以下两种方法

  • 我们可以选择很多UserAgent,形成一个列表,使用的时候通过middleware获取到settings.py文件中的配置,然后进行随机选择
  • 使用第三方库fake-useragent,这个库可以方便的生成一个随机UA,使用起来也很方便

本篇我们使用第二种方式来构建随机UA

  • 安装第三方库fake_useragent,使用命令pip install fake-useragent


  • 生成ua的方式很简单

from fake_useragent import UserAgent

ua = UserAgent(verify_ssl=False)  #正常不需要这个参数,如果无法获取请添加这个参数
print(ua.random)

下面开始项目代码的编写

  • 在middlewares.py文件中,我们对scrapy默认的UserAgentMiddleware进行改写


from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware   #导入默认的UA中间件的类
from fake_useragent import UserAgent
class LagouUserAgentMiddleware(UserAgentMiddleware):  #新建一个拉钩网的UA中间件类继承自默认的类
def process_request(self, request, spider):
request.headers.setdefault(b'User-Agent', UserAgent(verify_ssl=False).random) #设置一个随机的UA
print('当前ua %s' % request.headers['User-Agent']) #打印出来看一下
  • 把我们在lagou_c.py文件中custom_settings中的UA注释掉

  • 这样UA就设置好了,还需要到settings.py文件中把它激活

DOWNLOADER_MIDDLEWARES = {
#'lagou.middlewares.LagouDownloaderMiddleware': 543, #有注释,是未激活的中间件
'lagou.middlewares.LagouUserAgentMiddleware': 333, #优先级是333,自己随便设置,数字越小代表优先级越高
}
  • 我们运行一下爬虫,看下结果,可以看到UA在随机的更换

 二、随机代理

分析:构建随机代理可以采用以下两种方法

  • 我们可以选择很多proxy,形成一个列表,使用的时候通过middleware获取到settings.py文件中的配置,然后进行随机选择
  • 构建一个随机代理池,通过middleware对随机代理进行设置

这里我们采用第二种方式,网上有别人构建的代理池,我就直接拿来用了,毕竟重复造轮子的时间,你可以用来做很多其他事情了。

我这里使用的是阿里云ECS服务器Centos 7,本地windows操作一样

  • 首先使用git命令下载仓库(没有git的去下载一个,这个必学,可以简单理解为git本地仓库,github远程仓库,本地的可以上传,远程的可以下载)

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

  • 进入到PrxxyPool文件夹,然后再进入proxypool文件夹

  • 编辑里面的setting.py文件,修改TEST_URL = 'http://www.lagou.com',这么做的目的就是让这些代理去请求拉勾网,如果成功就说明这个代理有效

  • 我们接下来把这个代理池运行起来,在run.py文件目录下,运行run.py程序

  • 可以看到代理自动获取并且在测试可用性,我们可以打开浏览器,看下获取一个随机代理,如果是远程服务器,地址为ip:5555/random (ip为远程服务器ip),如果是阿里云服务器需要设置安全组,放开5555端口。


现在开始编写我们的爬虫代码

  • 在middlewares.py文件,新增一个LagouProxyMiddleware类

import requests
from requests.exceptions import ConnectionError class LagouProxyMiddleware(object):
    def __init__(self,proxy_url):
self.proxy_url = proxy_url def get_random_proxy(self):
’‘’
使用requests获取代理
‘’‘
try:
response = requests.get(self.proxy_url)
if response.status_code == 200:
random_proxy = response.text
return random_proxy
except ConnectionError:
return False def process_request(self, request, spider):
if request.meta.get('retry_times'): #如果重试次数为0,就使用默认的ip地址进行页面爬取,否则使用代理
random_proxy = self.get_random_proxy()
if random_proxy:
uri = 'https://{}'.format(random_proxy)
print('当前代理为{}'.format(request.meta['proxy']))
request.meta['proxy'] = uri #设置随机代理 @classmethod
def from_crawler(cls,crawler):
’‘’
类函数,使用crawler来获取settings中的PROXY_URL,也就是生成随机代理的url
‘’‘
settings = crawler.settings
return cls(
proxy_url=settings.get('PROXY_URL')
)
  • 在settings.py中激活这个中间件,并且定义PROXY_URL

DOWNLOADER_MIDDLEWARES = {
#'lagou.middlewares.LagouDownloaderMiddleware': 543,
'lagou.middlewares.LagouUserAgentMiddleware': 333,
'lagou.middlewares.LagouProxyMiddleware': 444,
} PROXY_URL = 'http://localhost:5555/random' #哪台设备运行的代理池,就把localhost修改为那台设备的ip,本机不用修改

至此我们就完成了随机UA和随机代理的设置,老规矩,运行下爬虫。当然,因为本地ip没有被封,所以一直就会使用本地ip,不会使用代理ip,毕竟免费的代理慢。

 

scrapy抓取拉勾网职位信息(六)——反爬应对(随机UA,随机代理)的更多相关文章

  1. scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

    本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...

  2. scrapy抓取拉勾网职位信息(三)——爬虫rules内容编写

    在上篇中,分析了拉勾网需要跟进的页面url,本篇开始进行代码编写. 在编写代码前,需要对scrapy的数据流走向有一个大致的认识,如果不是很清楚的话建议先看下:scrapy数据流 本篇目标:让拉勾网爬 ...

  3. scrapy抓取拉勾网职位信息(二)——拉勾网页面分析

    网站结构分析: 四个大标签:首页.公司.校园.言职 我们最终是要得到详情页的信息,但是从首页的很多链接都能进入到一个详情页,我们需要对这些标签一个个分析,分析出哪些链接我们需要跟进. 首先是四个大标签 ...

  4. scrapy抓取拉勾网职位信息(七)——数据存储(MongoDB,Mysql,本地CSV)

    上一篇完成了随机UA和随机代理的设置,让爬虫能更稳定的运行,本篇将爬取好的数据进行存储,包括本地文件,关系型数据库(以Mysql为例),非关系型数据库(以MongoDB为例). 实际上我们在编写爬虫r ...

  5. scrapy抓取拉勾网职位信息(四)——对字段进行提取

    上一篇中已经分析了详情页的url规则,并且对items.py文件进行了编写,定义了我们需要提取的字段,本篇将具体的items字段提取出来 这里主要是涉及到选择器的一些用法,如果不是很熟,可以参考:sc ...

  6. scrapy抓取拉勾网职位信息(七)——实现分布式

    上篇我们实现了数据的存储,包括把数据存储到MongoDB,Mysql以及本地文件,本篇说下分布式. 我们目前实现的是一个单机爬虫,也就是只在一个机器上运行,想象一下,如果同时有多台机器同时运行这个爬虫 ...

  7. scrapy抓取拉勾网职位信息(八)——使用scrapyd对爬虫进行部署

    上篇我们实现了分布式爬取,本篇来说下爬虫的部署. 分析:我们上节实现的分布式爬虫,需要把爬虫打包,上传到每个远程主机,然后解压后执行爬虫程序.这样做运行爬虫也可以,只不过如果以后爬虫有修改,需要重新修 ...

  8. scrapy抓取拉勾网职位信息(五)——代码优化

    上一篇我们已经让代码跑起来,各个字段也能在控制台输出,但是以item类字典的形式写的代码过于冗长,且有些字段出现的结果不统一,比如发布日期. 而且后续要把数据存到数据库,目前的字段基本都是string ...

  9. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

随机推荐

  1. Uva5211/POJ1873 The Fortified Forest 凸包

    LINK 题意:给出点集,每个点有个价值v和长度l,问把其中几个点取掉,用这几个点的长度能把剩下的点围住,要求剩下的点价值和最大,拿掉的点最少且剩余长度最长. 思路:1999WF中的水题.考虑到其点的 ...

  2. mysql 导出数据导致锁表

    故事原由:今天同事小星做系统优化时问我一个sql问题,为什么查询慢,我看了一眼,发现用到了表A中的datetime类型列进行时间比较,建议他给datetime类型列加上索引. 可这是生产库,表A里面有 ...

  3. 《JavaScript 实战》:实现图片幻滑动展示效果

    滑动展示效果主要用在图片或信息的滑动展示,也可以设置一下做成简单的口风琴(Accordion)效果.这个其实就是以前写的图片滑动展示效果的改进版,那是我第一篇比较受关注的文章,是时候整理一下了. 有如 ...

  4. [Mac]一些命令技巧

    Git相关 mac下git默认不区分大小写,通过下面脚本可以改变 #!/bin/bash # 让git区分大小写 cd 'path-of-project' git config core.ignore ...

  5. [linx] ubuntu网络重启命令

    /etc/init.d/networking restart #这种方式必须有/etc/network/interface文件 ifconfig eth0 down #直接重启网卡 ifconfig ...

  6. 从urllib和urllib2基础到一个简单抓取网页图片的小爬虫

    urllib最常用的两大功能(个人理解urllib用于辅助urllib2) 1.urllib.urlopen() 2. urllib.urlencode()   #适当的编码,可用于后面的post提交 ...

  7. U盘出现大量乱码文件,并且不能彻底删除

    问题如图所示: 问题出现原因:不正常的插拔等情况造成的,导致U盘的文件分配表错乱了 解决方法:参考http://bbs.cfanclub.net/thread-405004-1-1.html 运行ch ...

  8. OSCP考试回顾

    技术背景 从2011年开始接触学习渗透测试,全职做过的职位有渗透测试,Python后端研发,DevOps,甲方安全打杂. 学习过程 首先考试报名,交钱.买了价值800美元的一个月lab,包含Pente ...

  9. 某团队线下赛AWD writeup&Beescms_V4.0代码审计

    还是跟上篇一样.拿别人比赛的来玩一下.  0x01 预留后门 连接方式: 0x02 后台登录口SQL注入 admin/login.php 在func.php当中找到定义的check_login函数 很 ...

  10. Appium环境搭建说明(包括报错处理)

    Appium环境搭建说明 一.环境配置 前提是windows系统已安装以下软件: 1.jdk 我装的是1.8.0 2.android-sdk 3.python,3.4-3.6 5.Node.js,v8 ...