python中requests库+xpath+lxml简单使用


Posted in Python onApril 29, 2021

python的requests

它是python的一个第三方库,处理URL比urllib这个库要方便的多,并且功能也很丰富。
【可以先看4,5表格形式的说明,再看前面的】

安装

直接用pip安装,anconda是自带这个库的。

pip install requests

简单使用

requests的文档

1.简单访问一个url:

import requests
url='http://www.baidu.com'
res = requests.get(url)
res.text
res.status_code
<!DOCTYPE html>
<!--STATUS OK-->
<html>
 <head>
<meta http-equiv=content-type content=text/html;charset=utf-8>
<meta http-equiv=X-UA-Compatible content=IE=Edge>
<meta content=always name=referrer>
<link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css>
<title>百度ä¸?ä¸‹ï¼Œä½ å°±çŸ¥é“</title>
</head> 
<body link=#0000cc> 
<div id=wrapper> 
<div id=head> 
<div class=head_wrapper> 
<div class=s_form> 
<div class=s_form_wrapper>
 <div id=lg> 
<img hidefocus=true src=//www.baidu.com/img/bd_logo1.jpg width=270 height=129> 
</div>
 <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> 
<input type=hidden name=ie value=utf-8> 
<input type=hidden name=f value=8> 
<input type=hidden name=rsv_bp value=1>
 <input type=hidden name=rsv_idx value=1> 
<input type=hidden name=tn value=baidu>
<span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span>
<span class="bg s_btn_wr"><input type=submit id=su value=百度�下 class="bg s_btn"></span>
 </form>
 </div>
 </div>
 <div id=u1> 
<a href=http://news.baidu.com name=tj_trnews class=mnav>æ?°é—»</a>
 <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> 
<a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> 
<a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> 
<a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> 
<noscript> 
<a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript>
 <script>
document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === " rel="external nofollow"  rel="external nofollow"  rel="external nofollow" " ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> 
<a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> 
</div> 
</div> 
</div> 
<div id=ftCon> 
<div id=ftConw> 
<p id=lh> 
<a href=http://home.baidu.com>å³äºŽç™¾åº¦</a>
 <a href=http://ir.baidu.com>About Baidu</a>
 </p> 
<p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前å¿
读</a>&nbsp; 
<a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

200

乱码的,是由于没有转换字符,可以加入res.encoding='utf-8'解决,200是状态码。一般状态码是2xx都没什么问题的。

1xx:web服务器正确接收到请求了
2xx:处理成功,比如200表示正常,请求完成;204表示正常无响应等
3xx:重定向
4xx:客户端出现错误,比如著名的404找不到
5xx:服务器出现错误 ,比如500的内部错误

res.encoding='utf-8'
print(res.text)
<!DOCTYPE html>
<!--STATUS OK-->
<html> 
<head>
<meta http-equiv=content-type content=text/html;charset=utf-8>
<meta http-equiv=X-UA-Compatible content=IE=Edge>
<meta content=always name=referrer>
<link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css>
<title>百度一下,你就知道</title>
</head> 
<body link=#0000cc>
 <div id=wrapper>
 <div id=head> 
<div class=head_wrapper> 
<div class=s_form>
 <div class=s_form_wrapper> 
<div id=lg>
 <img hidefocus=true src=//www.baidu.com/img/bd_logo1.jpg width=270 height=129> 
</div> 
<form id=form name=f action=//www.baidu.com/s class=fm>
 <input type=hidden name=bdorz_come value=1> 
<input type=hidden name=ie value=utf-8>
 <input type=hidden name=f value=8> 
<input type=hidden name=rsv_bp value=1>
 <input type=hidden name=rsv_idx value=1> 
<input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=w
d class=s_ipt value maxlength=255 autocomplete=off autofocus></span>
<span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn"></span> 
</form>
 </div> 
</div>
 <div id=u1> 
<a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> 
<a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> 
<a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> 
<a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> 
<noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript>
 <script>
document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === " rel="external nofollow"  rel="external nofollow"  rel="external nofollow" " ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
</script>
 <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> 
</div> 
</div>
 </div> 
<div id=ftCon>
 <div id=ftConw>
 <p id=lh> 
<a href=http://home.baidu.com>关于百度</a> 
<a href=http://ir.baidu.com>About Baidu</a> 
</p> 
<p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; 
<a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> 
</p> 
</div>
 </div> 
</div> 
</body>
 </html>

主要的点

(1).用get请求得到的数据是一个response对象,用response.text属性来查看。
(2).修改编码形式用response.encoding='utf-8/gbk/...'encoding是它的一个属性可以查看response.encoding

res.encoding
>>>:
>'utf-8'

(3).无论响应是文本还是二进制内容,我们都可以用content属性获得bytes对象:

import requests
url='http://www.baidu.com'
res = requests.get(url)
print(res.content)
print("----------")
print(res.text)
print("----------")
print(type(res))
<!DOCTYPE html>\r\n<!--STATUS OK-->
<html> 
<head>
<meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b\xef\xbc\x8c\xe4\xbd\xa0\xe5\xb0\xb1\xe7\x9f\xa5\xe9\x81\x93</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.jpg width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=\xe7\x99\xbe\xe5\xba\xa6\xe4\xb8\x80\xe4\xb8\x8b class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>\xe6\x96\xb0\xe9\x97\xbb</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>\xe5\x9c\xb0\xe5\x9b\xbe</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>\xe8\xa7\x86\xe9\xa2\x91</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>\xe8\xb4\xb4\xe5\x90\xa7</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>\xe7\x99\xbb\xe5\xbd\x95</a> </noscript> <script>document.write(\'<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=\'+ encodeURIComponent(window.location.href+ (window.location.search === " rel="external nofollow" " ? "?" : "&")+ "bdorz_come=1")+ \'" name="tj_login" class="lb">\xe7\x99\xbb\xe5\xbd\x95</a>\');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">\xe6\x9b\xb4\xe5\xa4\x9a\xe4\xba\xa7\xe5\x93\x81</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>\xe5\x85\xb3\xe4\xba\x8e\xe7\x99\xbe\xe5\xba\xa6</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>\xe4\xbd\xbf\xe7\x94\xa8\xe7\x99\xbe\xe5\xba\xa6\xe5\x89\x8d\xe5\xbf\x85\xe8\xaf\xbb</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>\xe6\x84\x8f\xe8\xa7\x81\xe5\x8f\x8d\xe9\xa6\x88</a>&nbsp;\xe4\xba\xacICP\xe8\xaf\x81030173\xe5\x8f\xb7&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>\r\n'
----------
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge>
<meta content=always name=referrer>
<link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css>
<title>百度ä¸?ä¸‹ï¼Œä½ å°±çŸ¥é“</title><
/head> <body link=#0000cc> <div id=wrapper> 
<div id=head>
<div class=head_wrapper> <div class=s_form> 
<div class=s_form_wrapper> 
<div id=lg> 
<img hidefocus=true src=//www.baidu.com/img/bd_logo1.jpg width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> 
<input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8>
<input type=hidden name=rsv_bp value=1> 
<input type=hidden name=rsv_idx value=1>
<input type=hidden name=tn value=baidu>
<span class="bg s_ipt_wr">
<input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr">
<input type=submit id=su value=百度�下 class="bg s_btn">
</span>
</form>
</div> 
</div>
<div id=u1> 
<a href=http://news.baidu.com name=tj_trnews class=mnav>æ?°é—»</a> 
<a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> 
<a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> 
<a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> 
<noscript> 
<a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a>
</noscript>
<script>
document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === " rel="external nofollow"  rel="external nofollow"  rel="external nofollow" " ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
</script> 
<a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> 
</div>
</div>
</div> 
<div id=ftCon>
<div id=ftConw> 
<p id=lh> 
<a href=http://home.baidu.com>å³äºŽç™¾åº¦</a> 
<a href=http://ir.baidu.com>About Baidu</a>
</p>
<p id=cp>&copy;2017&nbsp;Baidu&nbsp;
<a href=http://www.baidu.com/duty/>使用百度前å¿è¯»</a>&nbsp;
<a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>
&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> 
</p> 
</div>
</div>
</div> 
</body> 
</html>
<class 'requests.models.Response'>

(4).status_code属性来查看该请求返回的状态码

2.带参数访问url

(1).带http 的头去访问可以传入参数:headers={'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'} ,不至于很快就被判断惩恶爬虫,把你的IP给封了。
(2).Cookie

# 获得指定cookie
r.cookies['cookie_name']
# 传入cookie 用dict来传递
cs = {'token':'密码','status':'状态'}
res = requests.get(url, cookies='cs')

3).指定超时

res = requests.get(url, timeout=3) #3秒后超时

注意:一般用get方法就可以爬取一些比较简单容易的网站。

4.requests的一些常用方法和主要参数

 

方法 说明
requests.request() 构造一个请求,用于以下各种方法的处理
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML提交局部修改请求的方法,对应于HTTP的PATCH
requests.delete() 向HTML提交删除请求的方法,对应于HTTP的DELETE

requests.get()方法的参数:
格式:requests.get(url, params=None, **kwargs) 最前面介绍的几个常用的掌握就够用了。

#url:要访问的url地址
# params:url中的额外参数,可选的,字典或者字典或字节形式传递
# **kwargs:控制访问的参数,可选
## headers,timeout,cookies,data,json,proxies,allow_redirects,stream,veriftty,cert,files,auth

5.requests.Response对象的属性说明

 

属性 说明
res.status_code HTTP请求返回的状态码,200表示连接成功,404表示失败
res.text HTTP响应内容的字符串形式,即url对应的页面内容
res.encoding 从HTTP header中猜测的响应内容的编码形式,乱码可以修改防止乱码
res.content 从内容中分析出的响应内容的编码方式,备用
res.apparent_encoding HTTP响应内容的二进制形式

xpath简介

Xpath是一门在xml文档中查找信息的语言。Xpath可用来在xml文档中对元素和属性进行遍历。由于html的层次结构与xml的层次结构天然一致,所以使用Xpath也能够进行html元素的定位。

定位方法 1.绝对路径定位:

顾名思义,将Xpath表达式从html的最外层节点,逐层填写,最后定位到操作元素,一般浏览器插件出来都是绝对定位
类似:/html/body/div[1]/div[2]/div[5]/div[1]/div[1]/form/span[2]/input

2.相对路径定位

通过相对路径定位元素,提取的是元素的部分特征,只要提取恰当,能够保证版本间稳定,是进行自动化测试的首选。
类似://div[@class='e']/a/p/span/text() @后面是属性,最后的text()提取标签之间的文本数据

3.索引号定位

类似:/html/body/div[1]/div[2]/div[5]/div[1]/div[1]/form/span[last()-1]/input 表示form下倒数第二个span

4.属性定位

类似://*[@id=“kw” and @name=‘wd'] 表示 id 属性为 kw 且 name 属性为 wd

5.其它定位方法

还要别的定位方法,不常用,不介绍

lxml简介

导入lxml 的 etree 库

from lxml import etree

简单使用

(1).利用etree.HTML,将html字符串(bytes类型或str类型)转化为Element对象,Element对象具有xpath的方法,返回结果列表。

html = etree.HTML(text) 
ret_list = html.xpath("xpath语法规则字符串")

(2).xpath方法返回列表的三种情况

返回空列表:根据xpath语法规则字符串,没有定位到任何元素
返回由字符串构成的列表:xpath字符串规则匹配的一定是文本内容或某属性的值
返回由Element对象构成的列表:xpath规则字符串匹配的是标签,列表中的Element对象可以继续进行xpath

注意:

(1).lxml.etree.HTML(html_str)可以自动补全标签

(2).lxml.etree.tostring函数可以将转换为Element对象再转换回html字符串

(3).爬虫如果使用lxml来提取数据,应该以lxml.etree.tostring的返回结果作为提取数据的依据

实例:爬取51.job的大数据职业信息的第一页【requests+xpath】

分析:打开首页,搜索大数据,定位是兰州,F12调式查看,爬取工作名称和公司名就好了

python中requests库+xpath+lxml简单使用

python中requests库+xpath+lxml简单使用

位置

python中requests库+xpath+lxml简单使用

python中requests库+xpath+lxml简单使用

python中requests库+xpath+lxml简单使用

import requests
from lxml import etree
url = "https://search.51job.com/list/270200,000000,0000,00,9,99,%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare="
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
res = requests.get(url,headers=header)
res.encoding = "gbk"
#print(res.text)
data = etree.HTML(res.text)#加载成html树
job_name = data.xpath("//div[@class='e']/a/p/span/text()")
cname = data.xpath("/html/body/div[2]/div[3]/div/div[2]/div[4]/div[1]/div/div[2]/a/@title")

到此这篇关于python中requests库+xpath+lxml简单使用的文章就介绍到这了,更多相关requests库+xpath+lxml使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python调用C/C++动态链接库的方法详解
Jul 22 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python中正则表达式的详细教程
Apr 30 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
详解python的ORM中Pony用法
Feb 09 Python
Django项目中包含多个应用时对url的配置方法
May 30 Python
python实现基于信息增益的决策树归纳
Dec 18 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
Python实现快速大文件比较代码解析
Sep 04 Python
用Python爬虫破解滑动验证码的案例解析
May 06 Python
python单元测试之pytest的使用
Jun 07 Python
python实现进度条的多种实现
教你如何使用Python下载B站视频的详细教程
Python+uiautomator2实现自动刷抖音视频功能
Django项目如何正确配置日志(logging)
Apr 29 #Python
django上传文件的三种方式
Apr 29 #Python
详解Django的MVT设计模式
Django如何与Ajax交互
Apr 29 #Python
You might like
PHP中PDO的错误处理
2011/09/04 PHP
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
php简单实现MVC
2015/02/05 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
Python变量作用范围实例分析
2015/07/07 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
python3.7.0的安装步骤
2018/08/27 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python统计文章中单词出现次数实例
2020/02/27 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python如何爬取动态网站
2020/09/09 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
经典优秀个人求职信分享
2013/12/12 职场文书
美化环境标语
2014/06/20 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
个人工作总结范文2014
2014/11/07 职场文书
中秋节寄语2015
2015/03/24 职场文书
婚宴新娘致辞
2015/07/28 职场文书
2019求职信大礼包
2019/05/15 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书