破解 Python 爬虫被封的小技巧(python爬虫破解百度文库)
cac55 2024-09-19 16:54 46 浏览 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初体验】获取源码。
相关推荐
- 如何屏蔽色情网站?_怎么能屏蔽网站
-
一、基础防御:全网DNS劫持阻断1.修改全网DNS服务器推荐DNS:安全DNS:CleanBrowsing(成人内容过滤):185.228.168.168/185.228.169.168Open...
- 容器、Pod、虚拟机与宿主机网络通信全解:看这一篇就够了
-
在日常开发与部署过程中,很多人一开始都会有这样的疑惑:容器之间是怎么通信的?容器怎么访问宿主机?宿主机又如何访问容器?Kubernetes中Pod的网络和Docker容器一样吗?容器跨机器是...
- Win11专业版找不到共享打印机的问题
-
有很多深度官网的用户,都是在办公室上班的。而上班就需要使用打印机,但更新win11系统后,却出现同一个办公室里面的打印机都找不到的问题,这该如何处理呢?其实,可能是由于我们并没有打开共享打印机而造成的...
- 常用电脑快捷键大全,摆脱鼠标依赖,建议收藏
-
Ctrl+C复制Ctrl+X剪切Ctrl+V粘贴Ctrl+Z撤销Ctrl+Y重做Ctrl+B加粗Ctrl+A全选所有文件Ctrl+S保存Ctrl+N新建Ctrl+O打开Ctrl+E...
- Win11实现自动追剧Jellyfin硬解,免NAS复杂操作
-
大家好,欢迎来到思赞数码。本期将详细介绍如何通过安装和配置Sonarr、Radarr、Prowlarr、qBittorrent和Jellyfin,打造一套自动化的影视管理系统。很多人认为,要实现自动追...
- 微软Win11安卓子系统WSA 2308.40000.3.0更新推送下载
-
IT之家9月21日消息,微软官方博客今日宣布,已面向所有WindowsInsider用户推送了Windows11安卓子系统的2308.40000.3.0版本更新。本次更新和之前...
- 路由器总掉线 一个命令就能猜出八九分
-
明明网络强度满格或有线图标正常,但视频卡成PPT、网页刷不开、游戏动不了,闲心这些问题很多小伙伴都碰到过。每次都要开关路由、宽带/光猫、插拔网线……一通忙。有没有啥办法能快速确定故障到底在哪儿,方便处...
- windows电脑如何修改hosts文件?_windows怎么修改hosts
-
先来简单说下电脑host的作用hosts文件的作用:hosts文件是一个用于储存计算机网络中各节点信息的计算机文件;作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中...
- win10广告弹窗ShellExperienceHost.exe
-
win10右下角老是弹出广告弹窗,排查为以下程序引起,但是这个是系统菜单的程序不能动:C:\Windows\SystemApps\ShellExperienceHost_cw5n1h2txyewy\S...
- Win10 Mobile预览版10512/10166越狱解锁部署已被黑客攻破
-
看起来统一的WindowsPhone和Windows越加吸引人们的关注,特别是黑客们的好奇心。XDA论坛宣称,在Win10Mobile预览版10512/10166上,已取得越狱/解锁部署突破,比如可...
- 6款冷门小众软件,都是宝藏,建议收藏
-
真的很不错(。-ω-)zzzBearhttps://bear.app/cn/Bear是一个漂亮,灵活的Markdown的写作工具。它一样只支持苹果家的全平台。它一出现就惊艳四方,就被AppSto...
- 如何让不符合条件的设备升级Windows 11
-
如果你是最近(6月24日之后)加入WindowsInsider项目并且你的设备并不符合升级条件,那么当你在尝试升级Windows11的时候可能会看到以下错误:你的PC不符合Wi...
- windows host文件怎么恢复?局域网访问全靠这些!
-
windowshost文件怎么恢复?windowshost文件是常用网址域名及其相应IP地址建立一个关联文件,通过这个host文件配置域名和IP的映射关系,以提高域名解析的速度,方便局域网用户使用...
- Mac Hosts管理工具---SwitchHosts
-
switchhosts!formac是一款帮助用户快速切换hosts文件的工具,switchhosts!formac能够帮助你快速方便的打造个人专用的网络环境,支持本地和在线两种方式,并且支持...
- 「浅谈趣说网络知识」 第十二弹 老而不死的Hosts,它还很有用
-
【浅谈趣说网络知识】第十二弹老而不死的Hosts,它还很有用什么时候才觉得自己真的老了,不是35岁以上的数字,不是头上的点点白发,而是不知觉中的怀旧。风口上的IT界讲的就是"长江后浪推前浪...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)