scrapy微博反爬虫_spider【第八篇】Scrapy突破反爬虫的限制

setting文件

为什么项目中需要配置文件

在配置文件中存放一些公共变量,在后续的项目中便便修改,注意其中的变量名一般全部大写

配置文件中的变量使用方法

导入即可使用

settings.py中的重点字段和内涵

USER_AGENT 设置ua

ROBOTSTXT_OBEY 是否遵守robots协议,默认是遵守

CONCURRENT_REQUESTS 设置并发请求的数量,默认是16个

DOWNLOAD_DELAY 下载延迟,默认无延迟

COOKIES_ENABLED 是否开启cookie,即每次请求带上前一次的cookie,默认是开启的

DEFAULT_REQUEST_HEADERS 设置默认请求头

SPIDER_MIDDLEWARES 爬虫中间件,设置过程和管道相同

DOWNLOADER_MIDDLEWARES 下载中间件

随机更换user-agent

每次url请求更换一次user-agent

pip install fake-useragent

settings

DOWNLOADER_MIDDLEWARES = {

# 'ArticleSpider.middlewares.MyCustomDownloaderMiddleware': 543,

'ArticleSpider.middlewares.RandomUserAgentMiddleware': 400,

}

middlewares

from fake_useragent import UserAgent

class RandomUserAgentMiddleware(object):

def __init__(self, crawler):

super(RandomUserAgentMiddleware, self).__init__()

self.ua = UserAgent()

# 若settings中没有设置RANDOM_UA_TYPE的值默认值为random,

# 从settings中获取RANDOM_UA_TYPE变量,值可以是 random ie chrome firefox safari opera msie

self.ua_type = crawler.settings.get('RANDOM_UA_TYPE', 'random')

@classmethod

def from_crawler(cls, crawler):

return cls(crawler)

def process_request(self, request, spider):

def get_ua():

'''根据settings的RANDOM_UA_TYPE变量设置每次请求的User-Agent'''

return getattr(self.ua, self.ua_type)

ua = get_ua()

request.headers.setdefault('User-Agent', get_ua())

ip代理

方案一:免费版

自定义函数获取网上的一些免费代理ip

settings

DOWNLOADER_MIDDLEWARES = {

'ArticleSpider.middlewares.RandomProxyMiddleware': 400,

}

middlewares

class RandomProxyMiddleware(object):

#动态设置ip代理

def process_request(self, request, spider):

request.meta["proxy"] = get_random_ip() # 这个自定义函数返回一个随机代理ip:port

方案二:收费版

github上scrapy-proxies等等

在线打码

编码识别:由于验证码识别难度大,而且易更新,所以编码识别验证码(不推荐)

在线打码:调用已经开发好的在线验证码识别软件接口识别验证码。识别率在90%以上,并且效率高(推荐)

人工打码:识别率近100%,但是成本高(用于复杂的)

cookie

1.一些网站会跟踪cookie,如果不需要登陆的网站,可禁用cookie,降低被ban概率,scrapy默认开启cookie

COOKIES_ENABLED = False

2.配合其他程序使用,比如其使用selenium把登陆之后的cookie获取到保存到本地,scrapy发送请求之前先读取本地cookie

importscrapyimportreclassRenrenSpider(scrapy.Spider):

name= 'renren'allowed_domains= ['renren.com']

start_urls= ['http://www.renren.com/941954027/profile']defstart_requests(self):

cookie_str= "cookie_str"cookie_dict= {i.split("=")[0]:i.split("=")[1] for i in cookie_str.split(";")}yieldscrapy.Request(

self.start_urls[0],

callback=self.parse,

cookies=cookie_dict,#headers={"Cookie":cookie_str}

)defparse(self, response):

ret= re.findall("新用户287",response.text)print(ret)yieldscrapy.Request("http://www.renren.com/941954027/profile?v=info_timeline",

callback=self.parse_detail

)defparse_detail(self,response):

ret= re.findall("新用户287",response.text)print(ret)

cookie登录人人网

自动限速

调整某些参数,如

AUTOTHROTTLE_ENABLED = True

DOWNLOAD_DELAY = 3

selenium

作用:浏览器操控

安装selenium

pip install selenium

下载对应浏览器的驱动

第三方(微博)登录知乎

import time

from selenium import webdriver

from scrapy.selector import Selector

browser = webdriver.Chrome(executable_path="D:/Package/chromedriver.exe")

time.sleep(2) # 延时为了让页面加载完

browser.get("https://www.zhihu.com/#signin")

browser.find_element_by_css_selector(".qrcode-signin-cut-button").click()

browser.find_element_by_css_selector(".signup-social-buttons").click()

browser.find_element_by_css_selector(".js-bindweibo").click()

#browser.switch_to.window(browser.window_handles[-1])

browser.find_element_by_css_selector(".WB_iptxt").send_keys("xxx")

browser.find_element_by_css_selector("input[node-type='passwd']").send_keys("xxx")

browser.find_element_by_css_selector("a[node-type='submit']").click()

time.sleep(2) # 延时为了让页面加载完

browser.find_element_by_css_selector("a[node-type='submit']").click()

第三方(QQ)登录知乎

# -*- coding: utf-8 -*-

__author__ = 'hy'

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值