爬虫基础第一篇

  

  什么是爬虫?

    通过编写程序模拟浏览器让其去互联网上获取数据

  爬虫的分类:

    1. 通用爬虫:爬取的是一整张网页源码数据

    2.聚集爬虫:爬取网页中局部的内容,聚集是建立在通用爬虫之上

    3.增量式爬虫:用来检测网站数据更新情况,从而爬取到网站找中最新出来的数据。

 

  反爬机制:对应的载体是门户网站,网站中可以指定相关的机制防止爬虫程序对其网站数据爬取

  反反爬机制:对应的载体是爬虫程序,爬虫程序可以破解网站采取的反爬机制,从而使得爬虫可以获取数据。

 

  第一个反爬机制:robots.txt协议

     -User-Agent: 请求载体的身份标识

     特征:文本协议,防君子不防小人

 

requests模块

  环境的安装: pip install requests

    作用:用于模拟浏览器发起网络请求

  requests的编码流程:

    1.指定url

    2.发起请求

    3.获取响应数据

    4.持久化存储

  参数动态化:get(params)

  UA 伪装:get(headers)

    UA检测被应用到了绝大数网站中。

  动态加载的数据:

    - 是由另一个单独的请求请求到的数据

    - 特性:可见非可得

  -如何鉴定一个网站中的相关数据是否为动态加载的数据

    -使用抓包工具做局部搜索

      -可以搜到就不是动态加载的,否则就不是

  -如何鉴定出数据为动态加载,如何捕获动态加载的数据?

    -在抓包工具中做全局搜索,从定位到的数据包中提取url请求参数,对其进行请求发送即可

数据解析:

  -正则表达式

  -bs4

  -xpath

-数据解析的通用原理

  - 概念:将爬取到的网页源码中指定的内容进行提取

  - 作用:用来实现聚焦爬虫(将页面中局部数据进行提取)

  -原理:

    -页面中数据是 存储在哪里的

      -存在于某个标签之中

      -存在于标签的属性中

    - 1.定位标签

    - 2. 数据的提取

- 正则表达式实现的数据解析

  - 定位标签

  - 数据的提取

- bs4解析

  -解析原理

    - 1. 实例化一个BeautifulSoup的对象,然后把即将被解析的页码数据加载到该对象中

    - 2. 调用该对象中相关的方法和属性实现标签定位和数据提取

  -BeautifulSoup对象实例化

    - BeautifulSoup(fp,'lxml')   :将本地存储的html文档中的数据进行解析

    -BeautifulSoup(page_text,'lxml')  :将互联网请求到的页面源码进行解析

      -lxml:一种解析器

  -环境安装

    pip install bs4

    pip install lxml

  - 标签定位

    - soup.tagName :定位到第一次出现的tagName

    -  属性定位find('tagName',attrName='value') find 只能定位符合要求的第一个标签

      - find_all()

    -  select(选择器): id,class,tag,层级选择器 一个大于号表示一个层级 空格表示多个层级

  - 取值

    - text :获取的是标签下面所有的文本内容 也包含其子标签下面的所有内容

    - string :获取标签的直系内容

  - 取属性值

    - tag['attrName']

      a_tag = soup.find('a',id="feng")

      print(a_tag['href'])

- xpath解析原理:

  - 1. 实例化一个etree类型的对象,吧即将被解析的页面源码数据加载到该对象中

  - 2. 调用该对象中的xpath方法结合着不同形式的xpath表达式进行标签定位和数据提取

  

  -etree对象实例化

    - etree.parse(filePath)

    - etree.HTML(page_text)

  - 环境的安装:

    pip install lxml

  - html 标签是满足树状结构的

    - 标签的定位

      最左侧的 / :表示xpath表达式必须从跟节点进行标签定位

      非最左侧斜杠表示一个层级

      最左侧是// : 表示从任意位置进行标签定位

      非最左侧// : 表示横跨多个层级
      tree = etree.parse('./test.html')
      print(tree.xpath('/html/head/title'))

    - 属性定位 //tag[@attrName="value]
      print(tree.xpath('//div[@class="song"]'))
  
    - 索引定位 从1开始
      tree.xpath('//div[@class="tang"]/ul/li[3]'

 

   - 取文本值:

    - /text() 取某个标签下的直系标签的值

    - //text() 取某个标签下所有的值

      print(tree.xpath('//p[1]/text()'))

      print(tree.xpath('//div[@class="tang"]//text()'))

   - 取属性

     print(tree.xpath('//a[@id="feng"]/@href'))

 

- xpath 表达式的管道符作用

  -- 提升通用性

 

posted @ 2019-09-23 18:10  ivy_wang  阅读(185)  评论(0编辑  收藏  举报