您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!

5b51 2022/1/14 8:24:27 python 字数 10673 阅读 633 来源 www.jb51.cc/python

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

概述

你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!

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 部分参数解析

进群:960410445  获取源码啊!

你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!

你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!

Middleware

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

process_request(request,spider)

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

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

你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!

参数:

process_exception(request,exception,spider)

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

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

参数:

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/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 x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',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/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,spider):
 ip = random.choice(self.ip)
 request.Meta['proxy'] = ip

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

DOWNLOADER_MIDDLEWARES = {
 # 首先禁止其原有的 UserAgentMiddleware
 'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,}

瞎比比

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

总结

以上是编程之家为你收集整理的你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!全部内容,希望文章能够帮你解决你的爬虫又被封了?你真是蠢的可以!用这个不再担心被封爬虫!所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶