爬虫学习笔记—— Scrapy框架

Posted 别呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫学习笔记—— Scrapy框架相关的知识,希望对你有一定的参考价值。

一、Request

Scrapy.http.Request类是scrapy框架中request的基类。它的参数如下:

  • url(字符串) - 此请求的URL

  • callback(callable)- 回调函数

  • method(string) - 此请求的HTTP方法。默认为’GET’。

  • meta(dict) - Request.meta属性的初始值。

  • body(str 或unicode) - 请求体。如果没有传参,默认为空字符串。

  • headers(dict) - 此请求的请求头。

  • cookies - 请求cookie。

  • encoding(字符串) - 此请求的编码(默认为’utf-8’)此编码将用于对URL进行百分比编码并将body抓换str(如果给定unicode)。

  • priority(int) - 此请求的优先级(默认为0),数字越大优先级越高。

  • dont_filter(boolean) - 表示调度程序不应过滤此请求。

  • errback(callable) - 在处理请求时引发任何异常时将调用的函数。

  • flags(list) - 发送给请求的标志,可用于日志记录或类似目的

from scrapy.http  import  Request,FormRequest

req=Request("http://www.baidu.com",headers={"spider":666},meta={"name":"爬虫"})
#功能构造请求
#参数
#请求对象
print(req.url)  #http://www.baidu.com
print(req.method)   #GET
print(req.headers)   #{b'Spider': [b'666']}
print(req.meta)  #{'name': '爬虫'}
rer=req.replace(url="https://www.baidu.com")
print(rer.url)   #https://www.baidu.com

二、FormRequest

get请求和post请求是最常见的请求。scrapy框架内置了一个FormRequest类
它扩展了基类Request,具有处理html表单的功能。

在使用scrapy发动POST请求的时候,常使用此方法,能较方便的发送请求.具体的使用,见登录github案例;

三、Response

url(字符串) - 此响应的URL
status(整数) - 响应的HTTP状态。默认为200。
headers(dict) - 此响应的响应头。dict值可以是字符串(对于单值标头)或列表(对于多值标头)。
body(字节) - 响应主体。要将解码后的文本作为str(Python 2中的unicode)访问,您可以使用response.text 来自编码感知的 Response子类,例如TextResponse。
flags(列表) - 是包含Response.flags属性初始值的列表 。如果给定,列表将被浅层复制。
request(Requestobject) - Response.request属性的初始值。这表示Request生成此响应的内容。

属性和方法
url 包含此请求的URL的字符串。该属性是只读的。更改请求使用的URL replace()。
method 表示请求中的HTTP方法的字符串。
headers 类似字典的对象,包含请求头。
body 包含请求正文的str。该属性是只读的。更改请求使用的URL replace()。
meta 包含此请求的任意元数据的字典。
copy() 返回一个新的请求,改请求是此请求的副本。
replace([ URL,method,headers,body,cookies,meta,encoding,dont_filter,callback,errback] ) 返回一个更新对的request


四、日志使用

logger

Scrapy logger 在每个Spider实例中提供了一个可以访问和使用的实例

例如:

self.logger.warning("可能会有错误")

日志文件配置

LOG_FILE 日志输出文件,如果为None,就打印在控制台
LOG_ENABLED 是否启用日志,默认True
LOG_ENCODING 日期编码,默认utf-8
LOG_LEVEL 日志等级,默认debug
LOG_FORMAT 日志格式
LOG_DATEFORMAT 日志日期格式
LOG_STDOUT 日志标准输出,默认False,如果True所有标准输出都将写入日志中
LOG_SHORT_NAMES 短日志名,默认为False,如果True将不输出组件名

示例(直接添加在settings里):

项目中一般设置:

LOG_FILE = 'logfile_name'
LOG_LEVEL = 'INFO'

日志格式输出:

LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_DATEFORMAT ='%Y'

日志等级:

DEBUG(调试信息)< INFO(一般信息) < WARNING(警告) < ERROR(错误) < CRITICAL(严重错误)

五、案例:实现Github登录

5.1、登录参数

登录需要向 https://github.com/session 网址提交用户名和密码,

除此之外,还有其他的参数(这里列举的仅供参考,具体还是要看网页的):

data={
	'commit': 'Sign in',
    'authenticity_token': authenticity_token,
    'login': 'xxxxxxxxx@qq.com',
    'password': 'xxxxxx',
    'trusted_device': '',
    'webauthn-support': 'supported',
    'webauthn-iuvpaa-support': 'unsupported',
    'return_to': 'https://github.com/login',
    'allow_signup': '',
    'client_id': '',
    'integration': '',
    required_field: '',
    'timestamp': timestamp,
    'timestamp_secret': timestamp_secret
}

注意:需要提交的数据可能来源:
1.之前访问的页面中
2.JS动态生成
这需要经过分析检验,有些数据需要我们来构造,有些是默认的。

5.2、请求流程

  1. 访问 https://github.com/login 获取 https://github.com/session 需要的参数
  2. 向 https://github.com/session 提交 post 用户名 密码等数据 获取登录页面

5.3、代码:

spider文件

import scrapy


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

    def parse(self, response):
        #通过对比分析,以下需要我们来自己构建
        authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract()[0]
        required_field = response.xpath('//input[@hidden="hidden"]/@name').extract()[0]
        timestamp = response.xpath('//input[@name="timestamp"]/@value').extract()[0]
        timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').extract()[0]
        data={
            'commit': 'Sign in',
            'authenticity_token': authenticity_token,
            'login': 'xxxxxxxxx@qq.com',  #记得写账号
            'password': 'xxxxxx',  #记得写密码
            'trusted_device': '',
            'webauthn-support': 'supported',
            'webauthn-iuvpaa-support': 'unsupported',
            'return_to': 'https://github.com/login',
            'allow_signup': '',
            'client_id': '',
            'integration': '',
            required_field: '',
            'timestamp': timestamp,
            'timestamp_secret': timestamp_secret
        }
        #使用FormRequest来请求
        yield scrapy.FormRequest(url='https://github.com/session',formdata=data,callback=self.verify_login)  


    def verify_login(self,response):
        if 'Q-bird1' in response.text:  #Q-bird1是我登录成功后,网页源码里的特有的一个字符串
            print('登录成功!!!')
        else:
            print('登录失败!!!')

settings文件

设置robots协议,添加全局请求头

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36',
}

#设置日志的输出格式
LOG_FORMAT='%(asctime)s [%(name)s] %(levelname)s: %(message)s'
LOG_DATEFORMAT ='%Y'

结果(表示我们已经成功了):

以上是关于爬虫学习笔记—— Scrapy框架的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy框架学习笔记:猫眼爬虫

爬虫学习笔记—— Scrapy框架

转载Python爬虫框架Scrapy学习笔记

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy主动退出爬虫的代码片段(python3)

爬虫学习笔记—— Scrapy框架:媒体管道