下载代码Cookie池(这里主要是微博登录,也可以自己配置置其他的站点网址)
下载代码GitHub:https://github.com/Python3WebSpider/CookiesPool
下载安装过后注意看网页下面的相关基础配置和操作!!!!!!!!!!!!!
自己的设置主要有下面几步:
1、配置其他设置
2、设置使用的浏览器
3、设置模拟登陆
源码cookies.py的修改(以下两处不修改可能会产生bug):
4、获取cookie
随机获取Cookies: http://localhost:5000/weibo/random(注意:cookie使用时是需要后期处理的!!)
简单的处理方式,如下代码(偶尔需要对获取的cookie处理):
def get_cookie(self):
return requests.get('http://127.0.0.1:5000/weibo/random').text
def stringToDict(self,cookie):
itemDict = {}
items = cookie.replace(':', '=').split(',')
for item in items:
key = item.split('=')[0].replace(' ', '').strip(' "')
value = item.split('=')[1].strip(' "')
itemDict[key] = value
return itemDict
def start_requests(self):
ua = UserAgent()
headers = {
'User-Agent': ua.random,
}
cookies = self.stringToDict(str(self.get_cookie().strip('{|}')))
yield scrapy.Request(url=self.start_urls[0], headers=headers,
cookies=cookies, callback=self.parse)
cookies = self.stringToDict(str(self.get_cookie().strip('{|}')))
yield scrapy.Request(url=self.start_urls[0], headers=headers,
cookies=cookies, callback=self.parse)
scrapy爬虫的使用示例(爬取微博):
middlewares.py中自定义请求中间件
import requests
import logging
import json
# 自定义微博请求的中间件
class WeiBoMiddleWare(object):
def __init__(self, cookies_pool_url):
self.logging = logging.getLogger("WeiBoMiddleWare")
self.cookies_pool_url = cookies_pool_url
def get_random_cookies(self):
try:
response = requests.get(self.cookies_pool_url)
except Exception as e:
self.logging.info('Get Cookies failed: {}'.format(e))
else:
# 在中间件中,设置请求头携带的Cookies值,必须是一个字典,不能直接设置字符串。
cookies = json.loads(response.text)
self.logging.info('Get Cookies success: {}'.format(response.text))
return cookies
@classmethod
def from_settings(cls, settings):
obj = cls(
cookies_pool_url=settings['WEIBO_COOKIES_URL']
)
return obj
# process_request()该方法会被多次调用,每一个request请求都会经过这个方法交给downloader
def process_request(self, request, spider):
request.cookies = self.get_random_cookies()
return None
def process_response(self, request, response, spider):
"""
对此次请求的响应进行处理。
:param request:
:param response:
:param spider:
:return:
"""
# 携带cookie进行页面请求时,可能会出现cookies失效的情况。访问失败会出现两种情况:1. 重定向302到登录页面;2. 也能会出现验证的情况;
# 想拦截重定向请求,需要在settings中配置。
if response.status in [302, 301]:
# 如果出现了重定向,获取重定向的地址
redirect_url = response.headers['location']
if 'passport' in redirect_url:
# 重定向到了登录页面,Cookie失效。
self.logging.info('Cookies Invaild!')
if '验证页面' in redirect_url:
# Cookies还能继续使用,针对账号进行的反爬虫。
self.logging.info('当前Cookie无法使用,需要认证。')
# 如果出现重定向,说明此次请求失败,继续获取一个新的Cookie,重新对此次请求request进行访问。
request.cookies = self.get_random_cookies()
# 返回值request: 停止后续的response中间件,而是将request重新放入调度器的队列中重新请求。
return request
# 如果没有出现重定向,直接将response向下传递后续的中间件。
return response
settings.py 中的配置:
5、录入账号和密码:
格式规定(账号----密码)
6、验证:(注意:使用cmd)
7、使用时注意保持cmd打开运行!!
使用时一定要打开cmd,并运行如第6步。
得到Cookie是判断是否处理处理Cookie(几乎都需要!!)类比第4步!!!