Python逆向爬虫之pyquery,非常详细
Python逆向爬虫之pyquery
pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便。
一、pyquery安装
pip install pyquery
二、pyquery对象初始化
pyquery首先需要传入HTML文本来初始化一个pyquery对象,它的初始化方式有多种,如直接传入字符串,传入URL或者传入文件名。
2.1 字符串初始化
from pyquery import PyQuery as pq
html = """
<div id="wenzhangziti" class="article 389862">
<p>人生是一条没有尽头的路,不要留恋逝去的梦,把命运掌握在自己手中,让我们来掌握自己的命运,
别让别人的干扰与诱惑,别让功名与利禄,来打翻我们这坛陈酿已久的命运之酒!</p>
</div>
"""
doc = pq(html)
print(type(doc))
print(doc('p').text())
2.2 URL初始化
from pyquery import PyQuery as pq
doc = pq(url='https://www.cnblogs.com/chenyangqit/p/15121161.html')
print(type(doc))
print(doc('title'))
PyQuery能够从url加载一个html文档,之际上是默认情况下调用python的urllib库去请求响应,如果requests已安装的话它将使用requests来请求响应,那我们就可以使用request的请求参数来构造请求了,实际请求如下:
from pyquery import PyQuery as pq
import requests
doc=pq(requests.get(url='https://www.cnblogs.com/chenyangqit/p/15121161.html').text)
print(type(doc))
print(doc('title'))
三、CSS选择器
在使用属性选择器中,使用属性选择特定的标签,标签和CSS标识必须引用为字符串,它会过滤筛选符合条件的节点打印输出,返回的是一个PyQuery类型对象。
from pyquery import PyQuery as pq
import requests
html='''
<div id="container">
<ul class="list">
<li class="item-0">first item</li>
<li class="item-1">
<a href="link2.html">second item</a>
</li>
<li class="item-0 active">
<a href="link3.html">
<span class="bold">third item</span>
</a>
</li>
<li class="item-1 active">
<a href="link4.html">fourth item</a>
</li>
<li class="item-0">
<a href="link5.html">fifth item</a>
</li>
</ul>
</div>
'''
doc=pq(html,parser='html')
print(doc('#container .list .item-0 a'))
print(doc('.list .item-1'))
四、查找节点
PyQuery使用查询函数来查询节点,同jQuery中的函数用法完全相同。
4.1 查找子节点和子孙节点
使用find()方法获取子孙节点,children()获取子节点,使用以上的HTML代码测试。
doc=pq(html,parser='html')
print('find:',doc.find('a'))
print('children:',doc('li').children('a'))
4.2 获取父节点和祖先节点
parent()方法获取父节点,parents()获取祖先节点。
doc(.list).parent()
doc(.list).parents()
4.3 获取兄弟节点
siblings()方法用来获取兄弟节点,可以嵌套使用,传入CSS选择器即可继续匹配。
doc('.list .item-0.active').siblings('.active')
五、遍历
对于pyquery的选择结果可能是多个字节,也可能是单个节点,类型都是PyQuery类型,它没有返回列表等形式,对于当个节点我们可指直接打印输出或者直接转换成字符串,而对于多个节点的结果,我们需要遍历来获取所有节点可以使用items()方法,它会返回一个生成器,循环得到的每个节点类型依然是PyQuery类型,所以我们可以继续方法来选择节点或属性,内容等。
lis=doc('li').items()
for i in lis:
print(i('a'))
六、获取信息
attr()方法用来获取属性,如返回的结果有多个时可以调用items()方法来遍历获取。
doc('.item-0.active a').attr('href') #多属性值中间不能有空格
text()方法用来获取文本内容,它只返回内部的文本信息不包括HTML文本内容,如果想返回包括HTML的文本内容可以使用html()方法,如果结果有多个,text()方法会方法所有节点的文本信息内容并将它们拼接用空格分开返回字符串内容,html()方法只会返回第一个节点的HTML文本,如果要获取所有就需要使用items()方法来遍历获取了。
from pyquery import PyQuery as pq
html='''
<div id="container">
<ul class="list">
<li class="item-0">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
doc=pq(html,parser='html')
print('text:',doc('li').text()) #获取li节点下的所有文本信息
lis=doc('li').items()
for i in lis:
print('html:',i.html()) #获取所有li节点下的HTML文本
七、节点操作
pyquery提供了一系列方法来对节点进行动态修改,如添加一个class,移除某个节点,修改某个属性的值。
addClass()增加Class,removeClass()删除Class
attr()增加属性和值,text()增加文本内容,html()增加HTML文本,remove()移除
from pyquery import PyQuery as pq
import requests
html='''
<div id="container">
<ul class="list">
<li id="1">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-2 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-3 active"><a href="link4.html">fourth item</a></li>
<li class="item-4"><a href="link5.html">fifth item</a></li>
</ul>
</div>
'''
doc=pq(html,parser='html')
print(doc('#1'))
print(doc('#1').add_class('myclass')) #增加Class
print(doc('.item-1').remove_class('item-1')) #删除Class
print(doc('#1').attr('name','link')) #添加属性name=link
print(doc('#1').text('hello world')) #添加文本
print(doc('#1').html('<span>changed item</span>')) #添加HTML文本
print(doc('.item-2.active a').remove('span')) #删除节点
- after()在节点后添加值
- before()在节点之前插入值
- append()将值添加到每个节点
- contents()返回文本节点内容
- empty()删除节点内容
- remove_attr()删除属性
- val()设置或获取属性值
另外还有很多节点操作方法,它们和jQuery的用法完全一致,详细请参考:http://pyquery.readthedocs.io/en/latest/api.html
八、伪类选择器
CSS选择器之所以强大,是因为它支持多种多样的伪类选择器,如:选择第一个节点,最后一个节点,奇偶数节点等。
from pyquery import PyQuery as pq
html = '''
<div id="container">
<ul class="list">
<li id="1">first item</li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-2 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-3 active"><a href="link4.html">fourth item</a></li>
<li class="item-4"><a href="link5.html">fifth item</a></li>
</ul>
<div><input type="text" value="username"/></div>
</div>
'''
doc = pq(html, parser='html')
print('第一个li节点:', doc('li:first-child')) # 第一个li节点
print('最后一个li节点:', doc('li:last_child')) # 最后一个li节点
print('第二个li节点:', doc('li:nth-child(2)')) # 第二个li节点
print('第三个之后的所有li节点:', doc('li:gt(2)')) # 第三个之后的所有li节点
print('偶数的所有li节点:', doc('li:nth-child(2n)')) # 偶数的所有li节点
print('包含文本内容的节点:', doc('li:contains(second)')) # 包含文本内容的节点
print('索引第一个节点:', doc('li:eq(0)'))
print('奇数节点:', doc('li:even'))
print('偶数节点:', doc('li:odd'))
更多伪类参考:http://pyquery.readthedocs.io/en/latest/pseudo_classes.html
更多css选择器参考:http://www.w3school.com.cn/cssref/css_selectors.asp
九、爬取豆瓣排行榜
from pyquery import PyQuery as pq
import re
def main():
head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
baseurl = "https://movie.douban.com/top250?start="
doc = pq(url=baseurl, headers=head)
list = []
for i in doc('.grid_view li').items():
vidow = {
"title": "",
"year": "",
"score": 0,
"num": 0
}
for item in i.items('li'):
vidow['title'] = item('.hd').text().replace('[可播放]', '').replace("\xa0", " ")
obj = re.compile('\d{4}', re.S)
result = obj.finditer(item('.bd p:nth-child(1)').text())
for year in result:
vidow['year'] = year.group()
for item in i.items(".rating_num"):
vidow['score'] = item.text()
for item in i.items(".star span:nth-child(4)"):
vidow['num'] = item.text().replace("人评价", "")
list.append(vidow)
print(list)
if __name__ == '__main__':
main()
Python逆向爬虫之pyquery,非常详细的更多相关文章
- Python逆向爬虫之scrapy框架,非常详细
爬虫系列目录 目录 Python逆向爬虫之scrapy框架,非常详细 一.爬虫入门 1.1 定义需求 1.2 需求分析 1.2.1 下载某个页面上所有的图片 1.2.2 分页 1.2.3 进行下载图片 ...
- Python网络爬虫神器PyQuery的使用方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests from pyquery import PyQuery as pq url ...
- Python爬虫之PyQuery使用(六)
Python爬虫之PyQuery使用 PyQuery简介 pyquery能够通过选择器精确定位 DOM 树中的目标并进行操作.pyquery相当于jQuery的python实现,可以用于解析HTML网 ...
- python爬虫之pyquery学习
相关内容: pyquery的介绍 pyquery的使用 安装模块 导入模块 解析对象初始化 css选择器 在选定元素之后的元素再选取 元素的文本.属性等内容的获取 pyquery执行DOM操作.css ...
- # Python3微博爬虫[requests+pyquery+selenium+mongodb]
目录 Python3微博爬虫[requests+pyquery+selenium+mongodb] 主要技术 站点分析 程序流程图 编程实现 数据库选择 代理IP测试 模拟登录 获取用户详细信息 获取 ...
- [Python] 网络爬虫和正则表达式学习总结
以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...
- Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱(转)
原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- Python网络爬虫
http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...
随机推荐
- Random方法中的nextInt(int arg0)方法讲解
nextInt方法会生成一个随机的在5以内的数,负载均衡随机策略底层用的就是这个方法: Random rand = new Random(); int index = rand.nextInt(5); ...
- React简单教程-5-使用mock
前言 一个前后端分离的项目,前端人员需要对接后端的接口.如果在后端的接口没有开发好,或者没有测试版可以对接的情况下,前端人员也不能坐等后端接口写好后再开始开发. 一个项目的,理想情况下接口的规范应该是 ...
- (持续更新)虚树,KD-Tree,长链剖分,后缀数组,后缀自动机
真的就是讲课两天,吸收一个月呢! \(1.\)虚树 \(2.\)KD-Tree \(3.\)长链剖分 \(4.\)后缀数组 后缀数组 \(5.\)后缀自动机 后缀自动机
- 2021.05.03【NOIP提高B组】模拟 总结
比较水的一场比赛,却不能 AK T1 有 \(n\) 次,每次给 \(A_i,B_i\) 问以 \(i\) 结尾的 \(A,B\) 的匹配中最大和的最小值 问最大和的最小值,却不用二分. 如果暴力排序 ...
- vs code nginx php xdebug配置
终于把VSCODE XDEBUG配置搞定了 分享一下 1. VSCODE 安装插件 PHP Debug( Debug supprot for PHP with XDebug); 2. VSCODE ...
- Django——模板应用
一.前言 前提:已经用命令提前创建好了项目DjangoTest,以下是基于该项目进行实战演练. 二.项目下创建templates文件夹 1.创建templates文件夹 2.创建HelloWorld. ...
- 如何写出同事看不懂的Java代码?
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是没更新就是在家忙着带娃的Hydra. 前几天,正巧赶上组里代码review,一下午下来,感觉整个人都血压拉满了.五花八门的代码 ...
- 记一次ms17-010复现过程
最近碰到业务需要使用msf,以前了解过,后面都忘记了.这次干脆写下来,省的每次去找别人写的. 首先是使用nmap探测端口 nmap -O -sV 192.168.153.130 --script=vu ...
- python基础知识-day9(数据驱动)
1.数据驱动的概念 在自动化测试中,需要把测试的数据分离到JSON,YAML等文件中. 2.YAML 的相关知识 YAML 入门教程 分类 编程技术 YAML 是 "YAML Ain't a ...
- Tapdata Cloud 2.1.4 来啦:数据连接又上新,PolarDB MySQL、轻流开始接入,可自动标记不支持的字段类型
需求持续更新,优化一刻不停--Tapdata Cloud 2.1.4 来啦! 最新发布的版本中,在新增数据连接之余,默认标记不支持同步的字段类型,避免因此影响任务的正常运行. 更新速览 ① 数 ...