欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python爬虫必备技术点(二)

程序员文章站 2024-03-14 15:03:40
...

Python爬虫必备技术点【续】

面向具有Python基础的Python爬虫爱好者,补充爬虫的认知、细化化爬虫中核心库的API(包、类、方法和属性)
如果需要相关的案例可以加我QQ(610039018),另外我在B站上已发布了相关的爬虫视频(https://www.bilibili.com/video/av93731419)。

一、非爬虫框架

1.1 爬虫的认知

  • 数据请求(网络请求库)
  • 数据解析(re/xpath/bs4)
  • 数据存储(csv/pymysql/json??)
  • 反反爬的策略
    • ip代理
    • ua池
    • cookie池: 收集手动登录之后的响应的Cookie信息
    • 请求间隔(2~5秒)
    • 验证码处理(打码平台、机器学习???)

1.2 网络请求库

  • urllib

    • request
      • urlopen()
      • urlretrieve(fullurl, filename)
      • Request(url, data=None, headers)
      • build_opener(*handlers)
      • HTTPHandler
      • HTTPCookieProcessor(http.cookiejar.CookieJar())
      • ProxyHandler(proxies={})
    • parse
      • quote()
      • urlencode()
    • http.client.HTTPResponse
      • code
      • getheaders()
      • getheader(name, default)
      • read() 读取的响应字节数据
  • requests (第三方)

    • request(method, url, params, data, json, files, headers, cookies, proxies, auth)
    • get(url, params, **kwargs)
    • post(url, data, json, **kwargs)
    • put(url, data, json, **kwargs)
    • delete(url, **kwargs)
    • Response
      • status_code
      • encoding
      • headers
      • content 字节数据
      • text 文本数据
      • json() json文本反序列化为Python的dict/list的对象

1.3 数据解析

  • re 正则表达式
  • xpath (pip install lxml)
    • lxml.etree.HTML(‘html内容’) 返回Element对象
      • xpath(‘path路径’) 返回Element或List[,…]
      • text 标签文本
      • get(‘标签属性’)
  • bs4 (pip install bs4)
    • from bs4 import BeautifulSoup

    • root = BeautifulSoup(html, ‘lxml’) bs4.element.Tag

    • 查询元素标签的方法

      • find(‘标签名’, class_, id_) 查找第一个
      • find_all(‘标签名’, class_, id_, limit=N) 查找前N个
      • select(‘css选择器’)
        • #id
        • .classname
        • 标签名
        • 后代标签
        • 兄弟标签 (查找多个标签)
        • 属性标签
        • 伪类
    • Tag属性

      • string/text
      • get_text()
      • attrs: dict 标签中所有属性的字典
      • contents 子标签的文本列表
      • descendants 子标签的Tag列表

1.4 多任务爬虫

  • 多线程
    • threading
      • Thread
    • queue.Queue 线程队列
  • 多进程
    • multiprocessing
      • Process
      • Queue 进程队列
  • 协程
    • asyncio
      • coroutine 协程装饰器
      • get_event_loop()
      • wait()
      • sleep()
    • yield from
    • async / await

1.5 selenium框架

以driver程序驱动浏览器,对目标(网站或网页)进行操作(请求网页、提取数据、截图、切换或关闭页签-window)。

  • chrome.get() 打开目标(发起请求)

  • chrome.quit() 退出浏览器

  • chrome.close() 关闭当前的窗口

  • chrome.find_element(By, value)

    • selenium.webdriver.common.by.By
      • ID
      • CLASS_NAME
      • NAME
      • XPATH
      • CSS_SELECTOR
      • LINK_TEXT
    • WebElement 查到的标签对象
      • get_attribute(‘属性名’, default)
      • text 标签文本
      • click()
      • send_keys()
      • rect 当前元素的位置(left, top, width, height)
  • chrome.find_elements(By, value)

  • execute_script()

  • save_screenshot(filename) 截图

  • 等待某一个标签元素出现

    • selenium.webdriver.support
      • ui
        • WebDriverWait
      • expected_conditions
        • visibility_of_all_elements_located((By, value))
ui.WebDriverWait(dirver, timeout) \
  .until(expected_conditions, error_msg )

1.6 docker

容器技术,将远程的docker仓库中的镜像下拉到本地, 再将镜像运行成为一个容器(进程)。

- 镜像操作
	- 基本信息 
		- 名称
		- 版本
		- ID
		- 描述
	- docker images 查看所有镜像
	- docker rmi 名称:版本号 / ID 删除镜像
	- docker run 名称:版本号 / ID 启动镜像
		- -dit 后台启动镜像,启动后可进入容器并打开新的terminal(终端)
		- -p 宿主机端口: 容器端口
- 容器操作
	- docker ps 查看正运行的容器
		- -a 查看所有的容器
		- -l 查看最后一个启动的容器
		
	- docker logs 容器名或ID  查看容器运行的日志
	- docker exec 容器名或ID Linux命令 在容器中执行Linux命令
		- docker exec -it 容器名或ID bash 进入容器
	- docker stop 容器名或ID
	- docker start 容器名或ID
	- docker restart 容器名或ID
	- docker rm -f 容器名或ID 删除容器, -f强制删除正运行的容器

二、日志模块进阶

2.1 日志格式

格式 说明
%(name)s 记录器的名称, 默认为root
%(levelno)s 数字形式的日志记录级别
%(levelname)s 日志记录级别的文本名称
%(filename)s 执行日志记录调用的源文件的文件名称
%(pathname)s 执行日志记录调用的源文件的路径名称
%(funcName)s 执行日志记录调用的函数名称
%(module)s 执行日志记录调用的模块名称
%(lineno)s 执行日志记录调用的行号
%(created)s 执行日志记录的时间
%(asctime)s 日期和时间
%(msecs)s 毫秒部分
%(thread)d 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息

2.2 日志模块应用

 import logging
 from logging import StreamHandler, FileHandler
  • 四个核心部分
    • 日志记录器logger: 记录日志信息
    • 日志处理器 handler: 记录信息之后,由handler去处理
    • 日志过滤器 filter: 对记录信息进行过滤。
    • 日志格式化 formatter: 由处理器对记录的信息按formatter格式进行处理(除HTTPHandler和SMTPHandler之外)。
  • 核心方法或函数
    • logging.getLogger(name) # 默认没有name时,返回root
    • logging.baseConfig() 配置root记录器的格式、处理器等。
    • logging.info()/debug()/warning()/error()/critical() 由root记录器记录日志信息。
  • logger记录器的核心方法
    • setLevel(logging.DEBUG|INFO|WARNING|ERROR|FATAL)
    • addHandler(handler)
    • addFilter(Filter)
    • debug()|info()….
  • handler处理器的核心方法
    • setLevel(logging.DEBUG|INFO|WARNING|ERROR|FATAL)
    • setFormatter(fmt)
  • Formatter初始化参数
    • format 格式化的字符串, 使用%(日志变量)s 相关日志变量占位符组成的字符串

        'hi, %(name)s, age is %(age)s' % {'age': 20, 'name': 'jack'}
        'hi, %s, age is %s' % ('disen', 30)
      
    • datefmt 指定 %(asctime)s 日志时间的格式, 通常使用 %Y-%m-%d %H:%M:%S 即年月日 时分秒格式。

三、scrapy框架

3.1 scrapy架构组成

  • 五个核心组件
    • engine 引擎, 协调其它四个组件之间的联系,即与其它四个组件进行通信,也是scrapy框架的核心。
    • spider 爬虫类, 爬虫程序的编写代码所在, 也是发起请求的开始的位置。spider发起的请求,经过engine转入到scheduler中。
    • scheduler 调度器, 调度所有的请求(优先级高,则会先执行)。当执行某一个请求时,由engine转入到downloader中。
    • donwloader 下载器, 实现请求任务的执行,从网络上请求数据,将请求到的数据封装成响应对象,并将响应的对象返回给engine。engine将数据响应的数据对象(以回调接口方式)回传给它的爬虫类对象进行解析。
    • itempipeline 数据管道, 当spider解析完成后,将数据经engine转入到此(数据管道)。再根据数据类型,进行数据处理(图片、文本)
  • 二个中间件
    • 爬虫中间件, 介于Spider和Engine之间的,可以拦截Spider的发起的请求及数据。
    • 下载中间件,介于Engine和Downloader之间的,可以拦截下载和响应。当然在下载处理之前,可以设置代理 、请求头、Cookie等操作(反反爬设置),还可以基于Splash或Selenium实现特定的操作。

3.2 scrapy指令

  • 创建项目命令
    • scrapy startproject 项目名称
  • 创建爬虫命令
    • scrapy genspider 爬虫名 域名
  • 启动爬虫命令
    • scrapy crawl 爬虫名
  • 调试爬虫命令
    • scrapy shell url
    • scrapy shell
      • fetch(url)
      • view(response)
      • response.xpath()

3.3 Response类

  • 属性相关【重点】
    • body 响应的字节数据
    • text 响应的编码之后文本数据
    • headers 响应头信息, 是字节数据
    • encoding 响应数据的编码字符集
    • status 响应的状态码
    • url 请求的url
    • request 请求对象
    • meta 元数据,用于request和callback回调函数之间传值
  • 解析相关【重点】
    • selector()
    • css() 样式选择器 , 返回Selector选择器的可迭代(列表)对象
      • scrapy.selector.SelectorList 选择器列表
        • x()/xpath()
      • scrapy.selector.Selector 选择器
      • 样式选择器提取属性或文本
        • ::text 提取文本
        • ::attr(“属性名”) 提取属性
    • xpath() xpath路径
      xpath路径,同lxml的xpath()写法
    • 选择器常用方法
      • css()/xpath()
      • extract() 提取选择中所有内容,返回是list
      • extract_first()/get() 提取每个选择器中的内容, 返回是文本

3.4 Request类

  • scrapy.http.Request
    请求对象的属性
    • url
    • callback 解释数据的回调函数对象
    • headers 请求头
    • priority 请求的优先级, 值越高,优先级越高(优先下载)

四、扩展练习

  • 写出selenium向下和向右滚动的脚本
 document.documentElement.scrollTop 向下
 document.documentElement.scrollLeft 向右
  • 写出restful接口设计规范(四个)
  - 每个资源都有唯一标识 URI
  - 每个资源具有四个动作, GET|POST|PUT|DELETE
  - 每次请求都是无状态
  - 接口交互的数据是json或xml
  • 写出常见的反爬虫和反反爬虫
 - 访问次数 - IP代理
 - Cookie验证- Cookie池
 - UA验证  - UA池
 - 验证码 - 打码平台
 - 动态js渲染 - Selenium/Splash

上一篇: 文件打包成zip

下一篇: