网络爬虫

本文介绍了网络爬虫的解析库使用,包括XPath、Beautiful Soup和pyquery。详细讲解了XPath的匹配规则,Beautiful Soup的节点操作,以及pyquery的基本用法。接着,讨论了数据存储,特别是MongoDB的插入、查询、计数、排序和更新操作。最后,提到了Ajax数据爬取的原理和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 = '''
<li class="li li-first"><a href="">first time</a></li>
'''
result = html.xpath('//li[contains(@class,"li")]/a/text()')

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

text = '''
<li class="li li-first" name="item"><a href="">first time</a></li>
'''
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"的所有节点
**选择所有节点
elementp选择所有p节点
element,elementdiv,p选择所有div节点和所有p节点
element elementdiv p选择div节点内部的所有p节点
element>elementdiv>p选择父节点为div的所有p节点
element+elementdiv+p选择紧接在div节点之后的所有p
[attribute][target]选择带有target属性的所有节点
[attribute=value][target=blank]选择target="blank"的所有节点
[attribute~=value][title~=flower]选择title属性包含单词flower的所有节点
:linka:link选择所有未被访问的链接
:visiteda: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在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值