Python爬虫必备技术点(二)

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
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值