网络爬虫

1、解析库的使用

1、XPath的使用(XML Path Language)

1、常用规则

表达式 描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
选取当前节点的父节点
@ 选取属性

示例://title[@lang=‘eng’]
代表选择所有名称为title,同时属性lang值为eng的节点

2、如果想获取li节点内部的文本,两种方式:

  • 先选取a节点再获取文本
    result = html.xpath('//li[@class="item-0"]/a/text()获取子节点a的文本

  • 使用//选取
    result = html.xpath('//li[@class="item-0"]//text()获取所有子孙节点的文本

3、属性多值匹配
使用contains()函数,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的值就完成匹配

text = '''
  • first time
  • ''' result = html.xpath('//li[contains(@class,"li")]/a/text()')

    4、多属性匹配
    根据多个属性确定一个节点,用运算符and连接,此外还有很多别的运算符用法相同

    text = '''
    
  • first time
  • ''' result = html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')

    2、Beautiful Soup的使用

    1、是Python的一个HTML或XML的解析库,用来从网页中提取数据,会自动将输入文档转换为Unicode编码,输出文档转换为UTF-8编码。

    2、

    • contents属性得到的是直接子节点的列表
    • descendants属性会递归查询所有子节点,得到所有的子孙节点
    • next_sibling和previous_sibling分别获取节点的下一个和上一个兄弟元素,next_siblings和previous_siblings分别返回所有前面和后面的兄弟节点的生成器

    3、方法选择器

    • find_all()
    • find()

    4、CSS选择器

    • 调用select()方法,如soup.select('ul')
    • 获取文本的两种方式:string属性、get_text()
    • CSS选择器常用语法规则
    选择器 例子 例子描述
    .class .intro 选择class="intro"的所有节点
    #id #container 选择id="container"的所有节点
    * * 选择所有节点
    element p 选择所有p节点
    element,element div,p 选择所有div节点和所有p节点
    element element div p 选择div节点内部的所有p节点
    element>element div>p 选择父节点为div的所有p节点
    element+element div+p 选择紧接在div节点之后的所有p
    [attribute] [target] 选择带有target属性的所有节点
    [attribute=value] [target=blank] 选择target="blank"的所有节点
    [attribute~=value] [title~=flower] 选择title属性包含单词flower的所有节点
    :link a:link 选择所有未被访问的链接
    :visited a:visited 选择所有已被访问的链接

    3、pyquery

    1、字符串初始化

    from pyquery import PyQuery as pq
    doc = pq(html)
    print(doc('li'))  # 打印所有的li节点
    

    2、传入URL

    from pyquery import PyQuery as pq
    doc = pq(url='https://cuiqingcai.com')
    

    3、基本的CSS选择器

    • doc('#container .list li')先选取id为container的节点,再选取其内部class为list的节点内部的所有li节点。具体参考上面CSS语法规则
    • find()查找所有的子孙节点,children()只查找子节点

    4、遍历
    pyquery选择结果都是PyQuery类型

    • 单个节点
      直接打印print(li)或者转成字符串print(str(li))
    • 多个节点就要调用items()
      lis = doc('li').items()

    5、获取信息

    • 获取属性
      调用attr()方法
    a = doc('.item-0.active a')
    print(a.attr('href'))
    
    • 获取文本
      调用text()方法

    2、数据存储

    1、MongoDB存储

    1、插入数据
    insert_one()insert_many([data1,data2])

    2、查询数据
    find_one({Key:Value})find({'age':{'$gt':20}})查找年龄大于20的数据
    比较符号表

    符号 含义 示例
    $lt 小于
    $gt 大于 {‘age’:{’$gt’:20}}
    $lte 小于等于
    $gte 大于等于
    $ne 不等于
    $in 在范围内 {‘age’:{’$in’:[20,23]}}}
    $nin 不在范围内

    功能符号表

    符号 含义 示例 示例含义
    $regex 匹配正则表达式 {‘name’:{’$regex’:’^M.*’}} name以M开头
    $exists 属性是否存在 {‘name’:{’$exists’:True}} name属性存在
    $type 类型判断 {‘age’:{’$type’:‘int’}} age的类型为int

    3、计数
    count()方法

    4、排序
    sort()方法,示例:
    results = collection.find().sort('name',pymongo.ASCENDING)指定升序排列,降序则是pymongo.DESCENDING

    5、偏移
    skip()limit()方法可以指定偏移几个元素和指定要取的个数
    results = cllection.find().skip(2).limit(2)
    注:数据库数量庞大时候如千万、亿级别,最好不要使用大的偏移量查询,很可能导致内存溢出。可以使用比较符号表的操作符来查询

    6、更新

    condition = {'name':'Kevin'}
    student = cllection.find_one(condition)
    student['age'] = 26
    result = cllection.update_one(condition, {'$set':student})
    
    condition = {'age':{'$gt':20}}
    result = cllection.update_many(condition,{'$inc':{'age':1}})
    

    3、Ajax数据爬取

    1、Ajax

    1、就是异步的JavaScript和XML,利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。

    你可能感兴趣的:(Python3网络爬虫开发实战,爬虫,学习笔记,python)