项目结构

Request Response
日志使用 Github登录
**

Request

分为三个部分解析,分别是参数,功能, 返回值

参数:

url, callback=None, method=’GET’
headers=None, body=None,cookies=None,
meta=None, encoding=’utf-8’, priority=0,
dont_filter=False, errback=None, flags=None,
cb_kwargs=None

功能

返回值

第一个 —- priority

功能:修改请求在调度器排队处理的优先级

参数: 数字(数字越大,优先级越高,越容易被处理请求从而获得响应)

返回值:
image.png

第二个 —- tdont_filter=False_filter=Falsedont_filter=False

功能: 对请求进行过滤,双重否定表肯定,那就是过滤

第三个 构造请求,包含headers url meta

  1. from scrapy.http import Request
  2. '''
  3. url, callback=None, method='GET', headers=None, body=None,
  4. cookies=None, meta=None, encoding='utf-8', priority=0,
  5. dont_filter=False, errback=None, flags=None, cb_kwargs=None
  6. '''
  7. req = Request("https://www.baidu.com/", headers={"spider":"666"}, meta={"name":"爬虫"})
  8. # 功能 构造请求
  9. # 参数
  10. # 返回值
  11. print(req.url)
  12. print(req.method)
  13. print(req.headers)
  14. print(req.meta)
  15. rer = req.replace(url="https://cn.bing.com/?form=HPEDGE")
  16. print(rer.url)

image.png

FormRequest

导入包

  1. from scrapy.http import Request, FormRequest

源码

  1. class FormRequest(Request):
  2. valid_form_methods = ['GET', 'POST']
  3. def __init__(self, *args, **kwargs):
  4. formdata = kwargs.pop('formdata', None)
  5. if formdata and kwargs.get('method') is None:
  6. kwargs['method'] = 'POST'
  7. super().__init__(*args, **kwargs)
  8. if formdata:
  9. items = formdata.items() if isinstance(formdata, dict) else formdata
  10. querystr = _urlencode(items, self.encoding)
  11. if self.method == 'POST':
  12. self.headers.setdefault(b'Content-Type', b'application/x-www-form-urlencoded')
  13. self._set_body(querystr)
  14. else:
  15. self._set_url(self.url + ('&' if '?' in self.url else '?') + querystr)

image.png

Response

对象参数返回值

  1. '''
  2. url, status=200, headers=None, body=b'', flags=None,
  3. request=None, certificate=None, ip_address=None,
  4. 功能 :构造response
  5. 参数 : status 响应的HTTP状态 默认为200
  6. flags 是包含Response.flags属性初始值的列表 。如果给定,列表将被浅层复制。
  7. request Response.request属性的初始值。这表示Request生成此响应的内容
  8. 返回值 :response 对象
  9. '''
  10. from scrapy.http.response import Response
  11. res = Response("https://www.baidu.com/", request=req)
  12. print('----' * 20)
  13. print('响应内容', res.body)
  14. print('响应URL', res.url)
  15. print('响应状态码', res.status)
  16. print('响应请求', res.request)
  17. print(res.meta)

测试状况

image.png

日志使用

创建项目

  1. cd C:\Users\41999\Documents\PycharmProjects\Python\TZSpyder\第七节Scrapy(四)\project
  2. # 创建项目
  3. scrapy startproject baidu
  4. # 进入项目文件夹
  5. cd baidu
  6. # 创建模板 注意命令行command line需要带网址 但网址不能带http请求
  7. scrapy genspider bd www.baidu.com

配置settings.py文件

添加请求头的代理

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12593872/1613615215881-54f34b05-90f8-43f6-9bd4-99e400112d1c.png#align=left&display=inline&height=71&margin=%5Bobject%20Object%5D&name=image.png&originHeight=142&originWidth=1035&size=281172&status=done&style=none&width=517.5)

添加日志配置

  1. # 日志的设置
  2. LOG_FILE = 'bd.log'
  3. LOG_FORMAT = '%(ascTime)s [%(name)s] %(levelname)s: %(message)s'
  4. LOG_DATEFORMAT = '%Y'
  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/12593872/1613615290934-c16258ec-f7bf-4316-9b78-d4cd755833c6.png#align=left&display=inline&height=70&margin=%5Bobject%20Object%5D&name=image.png&originHeight=140&originWidth=733&size=223482&status=done&style=none&width=366.5)

测试日志记录

  1. scrapy crawl bd

运行结果

image.png

日志文件配置的参数解读

第一个参数—-LOG_ENABLED

设置日志是否打印在控制台,若值为False,则无论如何不会出现在控制台,无论是否有db.log日志文件

image.png

第二个参数 日志等级

  1. LOG_LEVEL = 'DEBUG'
  2. # 调试信息的六个等级
  3. # DEBUG < INFO < WARNING < ERROR < CRITICAL

log文件中本就有这些不同等级的信息,可以利用等级设置剥离日志信息,一部分在控制台显示,一部分在log日志中显示
image.png

image.png

日志编码格式设置

image.png

第三个参数 标准输出 LOG_STDOUT

默认值为False
image.png
Ps: 这里程序代码出现问题,无法实现运行结果的部分呈现,print()打印语句(即标准输出在控制台),其他日志信息放在log日志文件里,无奈注释除日志开启设置外的所有代码,方才出现打印结果。

特别注意

有两个日志设置项目,它们的值无需双引号包裹
分别是开启日志 标准输出
image.png

补充

  1. self.logger.warning("可能出现错误")

image.png

Github登录

操作流程

1,先登录再退出

2,用错误密码登录,打开调试,进入第一个session,获取请求头信息

image.png

3,复制整个form表单 研究其内容,两次尝试登录,比较两次form表单的区别

image.png

  1. authenticity_token:
  2. login: 419997284@qq.com
  3. password: 1234567890
  4. timestamp
  5. timestamp_secret:

4,分析请求流程

1 验证源码中特定数据段的唯一性

image.png

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

5 解析登录页面的源码 拿到需要构造的信息

6 以字典方式构建程序向https://github.com/session推的信息,模拟浏览器

image.png

7 密码需要单独构建一个文件,以字符串的方式构建密码

image.png

8 生成的请求需要向另外一个函数回调,便于直观回报访问是否成功

image.png

细节处理:

导入包的时候需要单独将其设置为root文件夹

image.png

代码规范性:导入包的语句必须置顶,字符串信息置底

image.png
image.png

完整项目代码

  1. import scrapy
  2. from github.spiders.password.pw import P
  3. class LoginSpider(scrapy.Spider):
  4. name = 'login'
  5. allowed_domains = ['github.com']
  6. start_urls = ['http://github.com/']
  7. def parse(self, response):
  8. authenticity_token = response.xpath('//input[@name="authenticity_token"]/@value').extract()[0]
  9. timestamp = response.xpath('//input[@name="timestamp"]/@value').extract()[0]
  10. timestamp_secret = response.xpath('//input[@name="timestamp_secret"]/@value').extract()[0]
  11. required_field = response.xpath('//input[@type="text"]/@name').extract()[1]
  12. form_data = {
  13. "commit": "Sign in",
  14. "authenticity_token": authenticity_token,
  15. "login": "419997284@qq.com",
  16. "password": P,
  17. "webauthn-support": "supported",
  18. "webauthn-iuvpaa-support": "supported",
  19. "return_to": "",
  20. required_field: "",
  21. "timestamp": timestamp,
  22. "timestamp_secret": timestamp_secret
  23. }
  24. yield scrapy.FormRequest(url="https://github.com/session", callback=self.verify_login, formdata=form_data)
  25. @staticmethod
  26. def verify_login(response):
  27. if "spyder" in response.text:
  28. print("登录成功")
  29. else:
  30. print("登录失败")
  31. """
  32. 登录github
  33. 请求流程 向 https://github.com/session 以POST方式提交用户名,密码等数据,获取登录页面
  34. 访问 https://github.com/login 获取 https://github.com/session 需要的参数
  35. """
  36. '''
  37. 数据1
  38. commit: Sign in
  39. # 需要构造
  40. authenticity_token: ObiSBKOyhPoIsLhK6LZD7JcpCUcuuc6yb7EvlFTgsFXvgUY9P0J1hbG3siEh9hXkCPHmN/JbKstrUVxcTfTtog==
  41. login: 419997284@qq.com
  42. password: 1234567890
  43. trusted_device:
  44. webauthn-support: supported
  45. webauthn-iuvpaa-support: supported
  46. return_to:
  47. allow_signup:
  48. client_id:
  49. integration:
  50. required_field_3c42:
  51. timestamp: 1613621566846
  52. timestamp_secret: c82a32ff2a48da015b84fb8a7c1c5951d04968e0a0eeb44eddb2b654895f62cb
  53. '''
  54. '''
  55. 需要构造的数据
  56. authenticity_token:
  57. login: 419997284@qq.com
  58. password: 1234567890
  59. timestamp
  60. timestamp_secret:
  61. 参数获取的方式:
  62. 1 之前请求页面中获取
  63. 2 js代码动态构造
  64. '''

项目遗留报错

image.png