scrapy——4 —反爬措施—logging—重要参数—POST请求发送实战

scrapy——4

  1. 常用的反爬虫策略有哪些
  2. 怎样使用logging设置
  3. Resquest/Response重要参数有哪些
  4. Scrapy怎么发送POST请求

  • 动态的设置User-Agent(随即切换User-Agent,模拟不同的用户的浏览器信息)
  • 禁用Cookies(也就是不启用cookies middleware,不向Server发送cookies的使用发现爬虫行为)可以通过COOKIES_ENABLED控制CookiesMiddleware开启或关闭
  • 设置延迟下载(防止访问过于频繁,设置为2秒或者更高)
  • Google Cache 和 BaiduCache:如果可能的话,使用谷歌/百度等搜索引擎服务器页面缓存获取页面数据。
  • 使用Ip地址池:;VPN和代理IP,现在大部分网站都是根据IP来反爬的

 Log levels——Scrapy提供5层loggin等级:

  • CRITICAL - 严重错误(critical)
  • ERROR - 一般错误(regular errors)
  • WARNING - 警告信息(warning messages)
  • INFO - 一般信息(informational messages)
  • DEBUG - 调试信息(debugging messages)

logging设置:

通过在setting.py中进行以下设置可以被用来配置logging:

  • LOG_ENABLED 默认: True,启用logging
  • LOG_ENCODING 默认: 'utf-8',logging使用的编码
  • LOG_FILE 默认: None,在当前目录里创建logging输出文件的文件名
  • LOG_LEVEL 默认: 'DEBUG',log的最低级别
  • LOG_STDOUT 默认: False 如果为 True,进程所有的标准输出(及错误)将会被重定向到log中。例如,执行 print "hello" ,其将会在Scrapy log中显示。
  • 在尝试运行代码时,这样输入  scrapy crawl xxxx --nolog  输出时不会弹出logging信息

 

  • url: 就是需要请求,并进行下一步处理的url

  • callback: 指定该请求返回的Response,由那个函数来处理。
  • method: 请求一般不需要指定,默认GET方法,可设置为"GET", "POST", "PUT"等,且保证字符串大写
  • headers: 请求时,包含的头文件。一般不需要
  • meta: 比较常用,在不同的请求之间传递数据使用的。字典dict型
  • encoding: 使用默认的 'utf-8' 就行。
  • dont_filter: 表明该请求不由调度器过滤。这是当你想使用多次执行相同的请求,忽略重复的过滤器。默认为False。

  • status: 响应码
  • _set_body(body): 响应体
  • _set_url(url):响应url

 

实战—    豆瓣登陆

  •  先创建项目

  • douban_loginsettings.py    设置请求头以及你的账号和密码(setting中)

  • douban_loginspidersdouban_spider.py    写代码
    # -*- coding: utf-8 -*-
    import scrapy
    from ..settings import username, password
    
    
    class DoubanSpiderSpider(scrapy.Spider):
        name = 'douban_spider'
        allowed_domains = ['douban.com']
        start_urls = ['https://accounts.douban.com/login']
    
        def start_requests(self):
            data = {    # POST请求多要携带的数据,由formdata传递
                'source': 'index_nav',
                'form_email': username,
                'form_password': password,
            }   
            yield scrapy.FormRequest(url=self.start_urls[0], formdata=data, callback=self.login_after)
    
        def login_after(self, response):
            print(response.url)
            user = response.xpath('//a[@class="bn-more"]/span/text()').extract_first() # 获取用户姓名,方便确认登陆是或否成功
    
            print('当前用户:%s'%user)
    
    
    '''
    douban_login$ scrapy crawl douban_spider --nolog
    https://www.douban.com/
    当前用户:pywjh的帐号
    '''

实战二——gethub登陆

 方法雷同,在setting中设置用户名和密码,需要注意的是,gethub有一个令牌的反爬措施,需要get请求一个登陆页面获取令牌,再POST请求登陆

# -*- coding: utf-8 -*-
from ..settings import username, password

import scrapy


class GithubSpider(scrapy.Spider):
    name = 'github'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/login']

    def parse(self, response):
        token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()
        data = {
            'utf8': '',
            'authenticity_token': token,
            'login': username,
            'password': password,
            'commit': 'Sign in',
        }
        yield  scrapy.FormRequest(
            url='https://github.com/session',
            formdata=data,
            callback=self.parse_item)

    def parse_item(self,response):
        name = response.xpath('//*[@id="user-links"]/li[3]/details/summary/img/@alt').extract_first().replace('@', '')
        print('当前用户:%s'%name)
原文地址:https://www.cnblogs.com/pywjh/p/9942581.html