百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

破解 Python 爬虫被封的小技巧(python爬虫破解百度文库)

off999 2024-10-19 07:25 38 浏览 0 评论

阅读本文大约需要 18 分钟

目录

  • 前言
  • Spider
  • Middleware
  • 瞎比比

前言

上一篇文章《

爬虫利器初体验(1)

》中,我们举了个简单的栗子,但是在真实的开发中这样的爬虫代码很容易就会被封掉。那么怎么样才能避免这些事发生呢?这一这篇文章我们一起来学习,如何健壮我们的爬虫代码。

Spider

当 start_urls 未被指定,会调用 start_requests() ,该方法可以用于在爬取数据之前,先进行模拟登陆。

import scrapy
from scrapy.http import Request
from scrapy.selector import Selector
from urllib.parse import urljoin
from doubanTop250.items import Doubantop250Item
class DoubanTop250Spider(scrapy.spiders.Spider):
 # 此处为上面留下的小坑
 name = "douban"
 # 设置允许爬取的域名
 allowed_domains = ["douban.com"]
 # header信息
 my_header = {
 'Host': 'www.douban.com',
 'Referer': 'https://movie.douban.com',
 }
 # 表单需要提交的数据
 form_data = {'user': 'zone', 'pass': 'zone7'}
 # 自定义信息,向下层响应(response)传递下去
 customer_data = {'key1': 'value1', 'key2': 'value2'}
 def start_requests(self):
 return [scrapy.FormRequest("https://movie.douban.com/login",
 formdata=self.form_data, # 表单提交的数据
 headers=self.my_header,
 method='POST', # GET or POST
 meta=self.customer_data, # 自定义,向response传递数据
 errback=self.error_handle,
 callback=self.logged_in,
 # 如果需要多次提交表单,且url一样,那么就必须加此参数 dont_filter,防止被当成重复网页过滤掉了
 dont_filter=True
 )]
 def logged_in(self, response):
 # 解析模拟登陆数据
 pass
 def parse(self, response):
 # 默认回调函数
 pass
 def close(self,reson):
 # 关闭时调用
 pass

scrapy.FormRequest 部分参数解析

parse(self, response)

当 start_requests 没有指定回调函数时,默认回调 parse(self,response) 方法。parse 负责处理 response 并返回处理的数据以及(/或)跟进的 URL。

该方法及其他的 Request 回调函数必须返回一个包含 Request、dict 或 Item 的可迭代的对象。简单的来说,所谓的回调函数,其实就是告诉spider,在拿到了网站的 response 以后,交给谁来进行处理后面的页面的解析工作。这个看上一篇文章的代码就可以知道。

Middleware

这里说一下,关于自定义 middleware 需要重写的几个方法,可能你看完这一段长篇大论之后,还是懵逼的,没关系,我也是这样。不过,当你继续往下看,看一个实例之后,你就会明白。

process_request(request, spider)

当每个request通过下载中间件时,该方法被调用。

process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或 raise IgnoreRequest 。

  • 如果其返回 None ,Scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)。
  • 如果其返回 Response 对象,Scrapy将不会调用 任何 其他的 process_request() 或 process_exception() 方法,或相应地下载函数; 其将返回该 response。 已安装的中间件的 process_response() 方法则会在每个 response 返回时被调用。
  • 如果其返回 Request 对象,Scrapy则停止调用 process_request方法并重新调度返回的 request。当新返回的 request 被执行后, 相应地中间件链将会根据下载的 response 被调用。

如果其 raise 一个 IgnoreRequest 异常,则安装的下载中间件的 process_exception() 方法会被调用。如果没有任何一个方法处理该异常, 则 request 的errback(Request.errback) 方法会被调用。如果没有代码处理抛出的异常, 则该异常被忽略且不记录(不同于其他异常那样)。

参数:

  • request(Request 对象)–处理的 request
  • spider(Spider 对象)–该 request 对应的 spider

process_response(request, response, spider)

process_request() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或 raise 一个 IgnoreRequest 异常。

  • 如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。
  • 如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。
  • 如果其抛出一个 IgnoreRequest 异常,则调用 request 的 errback( Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。

参数:

  • request (Request 对象) – response 所对应的 request
  • response (Response 对象) – 被处理的 response
  • spider (Spider 对象) – response 所对应的 spider

process_exception(request, exception, spider)

当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括IgnoreRequest异常)时,Scrapy调用 process_exception() 。

process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。

  • 如果其返回 None ,Scrapy将会继续处理该异常,接着调用已安装的其他中间件的 process_exception() 方法,直到所有中间件都被调用完毕,则调用默认的异常处理。
  • 如果其返回一个 Response 对象,则已安装的中间件链的 process_response() 方法被调用。Scrapy将不会调用任何其他中间件的 process_exception() 方法。
  • 如果其返回一个 Request 对象, 则返回的request将会被重新调用下载。这将停止中间件的 process_exception() 方法执行,就如返回一个response的那样。

参数:

  • request (是 Request 对象) – 产生异常的request
  • exception (Exception 对象) – 抛出的异常
  • spider (Spider 对象) – request对应的spider

UserAgentMiddleware

多数情况下,网站都会通过 user-agent 来识别访问的用户是否为一台机器,就像爬取豆瓣一样,如果你没有设置 user-agent 的话,就会被拒绝访问。因此,我们只使用一个 user-agent 显然是不够的,因此,我们要想个办法来设置随机的 user-agent。于是,我们便可以自定义 UserAgentMiddleware 来解决这个问题。

首先,在 setting.py 中添加 user-agent ,如下:

MY_USER_AGENT = [
 'MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23',
 'iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)',
 'Opera/9.20 (Macintosh; Intel Mac OS X; U; en)',
 'Opera/9.0 (Macintosh; PPC Mac OS X; U; en)',
 'Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)',
 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
 'Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)',
 'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)',
 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20',
 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1',
 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',
 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1',
 'Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)'
]

然后在 middlewares.py 中添加如下代码:

class MyUserAgentMiddleware(UserAgentMiddleware):
 def __init__(self, user_agent):
 self.user_agent = user_agent
 @classmethod
 def from_crawler(cls, crawler):
 return cls(
 user_agent=crawler.settings.get('MY_USER_AGENT')
 )
 def process_request(self, request, spider):
 agent = random.choice(self.user_agent)
 request.headers['User-Agent'] = agent

最后启用这个 middleware ,在 setting.py 中修改 MyUserAgentMiddleware 的优先级,如下:

DOWNLOADER_MIDDLEWARES = {
 # 首先禁止其原有的 UserAgentMiddleware
 'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
 'doubanTop250.middlewares.MyUserAgentMiddleware': 300,
 'doubanTop250.middlewares.ProxyMiddleware': 543,
}

ProxyMiddleware

除了要更改 user-agent 之外,我们还要使用 ip 代理来健壮我们的爬虫程序。那么,在 scrapy 中如何来设置我们的 ip 代理呢?

首先,在 setting.py 中添加如下代码,为代理 ip:

PROXIES = [
 "194.186.20.62:21231"
 , "66.153.222.162:54684"
 , "219.234.5.128:3128"
 , "117.114.149.66:53281"
 , "117.114.149.66:53281"
 ]

ip 来自西刺代理,不过好像好多没用的代理。

然后在 middlewares.py 中添加如下代码:

from scrapy import signals
import random
class ProxyMiddleware(object):
 def __init__(self, ip):
 self.ip = ip
 @classmethod
 def from_crawler(cls, crawler):
 return cls(ip=crawler.settings.get('PROXIES'))
 def process_request(self, request, spider):
 ip = random.choice(self.ip)
 request.meta['proxy'] = ip

最后启用这个 middleware ,在 setting.py 中修改 ProxyMiddleware 的优先级,如下:

DOWNLOADER_MIDDLEWARES = {
 # 首先禁止其原有的 UserAgentMiddleware
 'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
 'doubanTop250.middlewares.MyUserAgentMiddleware': 300,
 'doubanTop250.middlewares.ProxyMiddleware': 543,
}

瞎比比

经过这些操作之后,你的代码等级就提升了一个高度了。说了那么多,我们好像还没有将我们抓取的数据保存下来,那么下一篇文章将会说说如何保存我们的数据。后台回复【scrapy初体验】获取源码。

相关推荐

雨林木风win7旗舰版32(雨林木风win7旗舰版安装教程)

安装雨林木风GHOSTwin764位旗舰版系统需要您按照以下步骤进行:1.下载并解压缩GHOST文件。通常,GHOST文件是经过压缩的,您需要使用WinRAR或7-Zip等解压缩工具将其提取出来...

oppo手机管家下载(苹果手机管家免费下载安装)

可能是系统应用,这类应用在卸载时一般会因为没有root,所以其实没有卸载,而是停用了。可以在设置->应用程序里找到它,再启用试试。如果需要更新,可以用系统自带的应用商店更新。一般这类软件不需要更...

win10下载游戏用什么软件(win10下载游戏用什么软件好)

Windows10系统可以使用以下游戏下载器:1.Steam:Steam是最受欢迎的游戏下载器之一,拥有大量游戏可供下载。2.GOGGalaxy:GOGGalaxy是一个专门为GOG平台设计...

注册hotmail免费邮箱(注册hotmail邮箱需要手机吗)
  • 注册hotmail免费邮箱(注册hotmail邮箱需要手机吗)
  • 注册hotmail免费邮箱(注册hotmail邮箱需要手机吗)
  • 注册hotmail免费邮箱(注册hotmail邮箱需要手机吗)
  • 注册hotmail免费邮箱(注册hotmail邮箱需要手机吗)
win8系统对硬件的要求(win8.1 硬件要求)

需要硬件,音响的提升不太大,大灯看个人对灯光的需求,常开豪车的可能会觉得iq灯更舒服,其实标配的大灯满足日常生活没问题了。驾驶辅助包目前不选配的情况下车道保持可以通过刷机刷出来,后期应该能实现交通标志...

电信宽带办理套餐(电信宽带办理套餐最低多少)

1、每月99元(全国流量20G):送100M宽带+全国流量20G+300分钟通话+光猫免费+4K高清机顶盒免费+免费上门+免费安装(限城中村或部分竞争小区办理)2、每月119元(全国流量40G):送3...

qq号注册微信(qq号注册微信账号教程)

1、直接进入微信,点击下方的注册。2、它要我们输入电话号,别担心,我们按它的来,之后这个手机号是可以解除绑定的,不会有任何影响。3、之后会发验证码给你,输入后就能到这个界面,我的手机是自动输入并跳转到...

windows10录屏快捷键(windows10录屏快捷键ctrl加什么)
  • windows10录屏快捷键(windows10录屏快捷键ctrl加什么)
  • windows10录屏快捷键(windows10录屏快捷键ctrl加什么)
  • windows10录屏快捷键(windows10录屏快捷键ctrl加什么)
  • windows10录屏快捷键(windows10录屏快捷键ctrl加什么)
硬盘调整分区大小工具
  • 硬盘调整分区大小工具
  • 硬盘调整分区大小工具
  • 硬盘调整分区大小工具
  • 硬盘调整分区大小工具
电脑分辨率在哪里调(win10分辨率怎么调)

调整电脑分辨率的方法取决于您使用的是Windows、macOS还是Linux操作系统。以下是针对这三种操作系统的调整分辨率方法:1.Windows操作系统:-在桌面空白处右键单击,选择"显...

rar暴力破解器安卓版(暴力破解器压缩包)

安卓手机锁屏密码忘了,解决方法步骤如下:1.首先拆下手机电池,等待三秒钟以上时再装回电池,同时按下“音量上”和“电源键”并保持10秒钟以上时,手机自动进入recovery模式。2.在recovery模...

电脑开机慢是硬盘问题吗(电脑开机慢是硬盘坏了吗)

  电脑开机有两个含义,第一个就是通电,显示器上有显示;第二个是进系统。  电脑不装硬盘,只能达到第一种效果,系统肯定是进不去的,因为系统是装在硬盘上的,没有硬盘,就没有系统,也就启动不了。  当然,...

磁力种子(磁力种子搜索器怎么用)

BT的种子是指在BitTorrent文件分享协议中的一个文件或者目录,其中包含有一个或多个文件的元数据,例如文件名、大小、哈希值等信息。一个种子文件可以看做是一个索引,用来描述一个或多个文件的组成和布...

app store直接下载(app store直接下载软件)
  • app store直接下载(app store直接下载软件)
  • app store直接下载(app store直接下载软件)
  • app store直接下载(app store直接下载软件)
  • app store直接下载(app store直接下载软件)
windows图片查看器无法显示此图片

是因为没有正确配置Windows颜色系统默认设备文件造成的,解决该问题的具体步骤是:打开控制面板,查看方式选择“大图标”,单击打开“颜色管理”对话框,单击选中“高级”选项卡,将Windows颜色系统设...

取消回复欢迎 发表评论: