0


Scrapy各种反反爬机制你都知道吗?

🌵爬虫之Scrapy系列文章

🌴欢迎点赞评论学习交流~

🌱各位看官多多关注哦😘~

🍉内容介绍

🌵Scrapy如何设置请求头?

🌵Scrapy获取数据过快被封ip该如何处理?

🌵Scrapy如何动态获取数据你知道吗?

🌵Scrapy程序出现Bug给你发邮件想学习吗?

** 芜湖 起飞~ **

🌴Scrapy请求头设置

  1. 学过爬虫的和没学过爬虫的都应该听说过请求头。请求头它是访问一个网站时,发送请求时所携带的一种用户标识,哈哈,明白这些就行了,那用Scrapy框架时该如何把固定的请求头换成我们想要的请求头呢?往下看~

创建一个项目,找到TextSpiderMiddleware,这个是爬虫中间键。

  1. #随机user-agents
  2. import random
  3. class RandomUserAgentMiddleware():
  4. def __init__(self):
  5. self.user_agents = [
  6. 'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)',
  7. 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2',
  8. 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1'
  9. ]
  10. def process_request(self, request, spider):
  11. request.headers['User-Agent'] = random.choice(self.user_agents)

我们添加以上代码,这里我只写了三个请求头,可自行添加。作用是设置随机请求头。

添加了代码后我们要去settings.py中放开**DOWNLOADER_MIDDLEWARES,**再将我们的类名写入并指定优先级。

网址:https://httpbin.org/get

我们访问它可以得到我们请求服务器的一些参数,我们发现这时User-Agent已经变成了我们设置的随机请求头中的一个。

🌴Scrapy设置时间间隔

  1. 对于一些做过反爬的网站,可能你去用Scrapy去获取数据时他可能会限制你的爬取速度,你一旦触及到了它设置的反爬机制你就爬不到数据了,对于Scrapy框架这种神级框架它也有对此的应对策略。

同样的我们进入到这个包中。

  1. import time
  2. import logging
  3. # 设置随机延时
  4. class RandomDelayMiddleware(object):
  5. def __init__(self, delay):
  6. self.delay = delay
  7. @classmethod
  8. def from_crawler(cls, crawler):
  9. delay = crawler.spider.settings.get("DOWNLOAD_DELAY", 1) #setting里设置的时间,注释默认为1s
  10. if not isinstance(delay, int):
  11. raise ValueError("RANDOM_DELAY need a int")
  12. return cls(delay)
  13. def process_request(self, request, spider):
  14. # delay = random.randint(0, self.delay)
  15. delay = random.uniform(0, self.delay)
  16. delay = float("%.1f" % delay)
  17. logging.debug("### time is random delay: %s s ###" % delay)
  18. time.sleep(delay)

添加以上代码。作用是对访问进行随机延时处理。

进入到settings.py文件,添加text.middlewares.RandomDelayMiddleware,设置优先级即可,再找到DOWNLOAD_DELAY = 3放开。我们测试一波~

控制台帮我们打印出了延迟的时间2.2s,这个延迟范围为(0,3)。

🌴Scrapy动态获取数据

  1. 爬虫基础学习中我们学过selenium自动化处理一些模拟登录和静态html数据的获取的案例。Scrapy框架该如何设置动态获取数据呢?
  1. #配置动态数据采集
  2. from selenium import webdriver
  3. from logging import getLogger
  4. from scrapy.http import HtmlResponse
  5. from pyppeteer import launch
  6. import asyncio
  7. class SeleniumMiddleware():
  8. def __init__(self):
  9. self.logger = getLogger(__name__)
  10. # self.timeout = random.randint(1,3)
  11. #PhantomJS.exe的路径
  12. self.browser = webdriver.PhantomJS(executable_path=r'D:\Phantomjs\phantomjs-2.1.1-windows\phantomjs-2.1.1-windows\bin\phantomjs.exe')
  13. self.browser.set_window_size(1400, 700)
  14. # self.browser.set_page_load_timeout(self.timeout)
  15. # chrome浏览器
  16. def process_request(self, request, spider):
  17. self.logger.debug('PhantomJS is Starting')
  18. self.browser.get(request.url)
  19. body = self.browser.page_source
  20. return HtmlResponse(url=request.url, body=body, request=request, encoding='utf-8',status=200)
  21. # ppeteer浏览器
  22. # def process_request(self, request, spider):
  23. # page_html = asyncio.get_event_loop().run_until_complete(self.main(request.url))
  24. # return HtmlResponse(url=request.url, body=page_html, request=request, encoding='utf-8', status=200)
  25. #
  26. # async def main(self, url):
  27. # browser = await launch()
  28. # page = await browser.newPage()
  29. # await page.goto(url)
  30. # text = await page.content()
  31. # return text
  32. #关闭浏览器
  33. def __del__(self):
  34. self.browser.close()

这里我们结合PhantomJS无头浏览器来获取数据,下面有两种打开方式一种是Chrome浏览器,还有一种是ppeteer浏览器。

控制台打印出这句话时,说明你已经启动了PhantomJS无头浏览器。

🌴Scrapy发邮件

  1. 当我们在用Scrapy框架爬取大量数据时,程序可能要运行很久,当程序出现bug时如何及时告知爬虫程序有bug呢?我们可以接入python自带的邮件发送库,当程序出错时自动发送一封邮件到你的手机上告诉你程序出错了,是不是很神奇~

**讲这个内容前我先说一说如何开启qq邮箱的POP3/SMTP服务,就是你开启了这个服务后,可以通过代码来给别人发邮件,当然也可以给自己发~ **

登录电脑版的qq邮箱--->账户--->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

按照提示步骤开启就行,记住短信发送来的授权码。做完这些后我们来测试一波~

  1. import scrapy
  2. from pydispatch import dispatcher
  3. from scrapy import cmdline, signals
  4. from scrapy.mail import MailSender
  5. #配置邮件发送功能
  6. class XxxSpider(scrapy.Spider):
  7. name = 'xxx'
  8. # allowed_domains = ['xx.com']
  9. # start_urls = ['https://careers.tencent.com/search.html?keyword=python']
  10. start_urls = 'https://careers.tencent.com/search.html?index={}&keyword=python'
  11. start_urls = 'https://httpbin.org/get'
  12. mailers = MailSender(smtphost="smtp.qq.com", # 发送邮件的服务器
  13. mailfrom="xxxxxxxx@qq.com", # 邮件发送者
  14. smtpuser="xxxxxxx@qq.com", # 用户名
  15. smtppass="*", # 发送邮箱的密码不是你注册时的密码,而是授权码!!!切记!
  16. smtpport=25 # 端口号
  17. ) # 初始化邮件模块
  18. def __init__(self):
  19. """ 监听信号量 """
  20. super(XxxSpider, self).__init__() # 当收到spider_closed信号的时候,调用下面的close方法来发送通知邮件
  21. dispatcher.connect(self.spider_closed, signals.spider_closed)
  22. def spider_closed(self, spider, reason):
  23. # 上方的信号量触发这个方法
  24. stats_info = self.crawler.stats._stats # 爬虫结束时控制台信息
  25. body = "爬虫[%s]已经关闭,原因是: %s.\n以下为运行信息:\n %s" % (spider.name, reason, stats_info)
  26. subject = "[%s]爬虫关闭提醒" % spider.name
  27. self.mailers.send(to={"xxxxx@qq.com"},
  28. subject=subject,
  29. body=body)
  30. def start_requests(self):
  31. for i in range(1, 3):
  32. yield scrapy.Request(url=self.start_urls.format(i), callback=self.parse)
  33. # yield scrapy.Request(url=self.start_urls,callback=self.parse)
  34. def parse(self, response):
  35. print(response.text)

以上是测试代码~

**已收到爬虫结束的邮件 **

🍉结束


本文转载自: https://blog.csdn.net/weixin_54667422/article/details/125107859
版权归原作者 颜语凌 所有, 如有侵权,请联系我们删除。

“Scrapy各种反反爬机制你都知道吗?”的评论:

还没有评论