「Python」爬虫-2.xpath解析和cookie,session
theme: cyanosis highlight: atelier-lakeside-light
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天, 点击查看活动详情
前言
本文主要介绍爬虫知识中的xpath解析以及如何处理cookies,将配合两个案例-视频爬取和b站弹幕爬取分别讲解。
如果对爬虫的整体思维(确定目标网址 -> 请求该网址 ->读取response -> 处理response -> 写入文件/...)不大了解的话,可以先阅览一下的我的上一篇文章~,bs4解析的方式在上一篇有讲解。 「Python」爬虫-1.入门知识简介 - 掘金 (juejin.cn)
在上一篇爬虫入门的知识中我们运用了bs4的方法对返回的页面源代码进行解析,从而拿到了我们想要的信息。这里再接着引出一种更为简单(~~无脑~~的方法对页面信息进行提取---xpath。
xpath
xpath是xml文档中搜索内容的一门语言,html是xml的一个子集。所以通过xpath
就可以搜索(/提取)html中有价值的信息。
什么是XML?
可扩展标记语言,标准通用标记语言的子集,简称XML,是一种用于标记电子文件使其具有结构性的标记语言。——摘自百度百科。XML是用来传输和存储数据的,不是用来显示数据的,所以XML文档不包含格式或者布局信息,没有HTML布局明确。更为详细的解说请参考 - 认识XML文档(一)什么是XML文档? - 知乎 (zhihu.com)
使用xpath方法前需要安装lxml
模块
安装命令如下:
pip install lxml
xpath中最常见的方式就是
text() 拿文本
,下面将为你慢慢道来xpath的使用方法~
首先在使用xpath之前需要引包,该语句是
from lxml import etree
这里以猪八戒网为例,http://beijing.zbj.com/search/f/
可以自己输入关键词,比如:前端开发,然后就可以看到一个一个的div盒子了,直接大胆猜测每一个商品的布局都类似。(~~毕竟没有开发人员会无聊到把结构类似的东西搞的花里胡哨吧?)~~
接下来使用打开开发者工具,F12
键,这里以爬取商店的名字为例,使用xpath方法解析。可以利用下面这个小三角定位到商铺名字上去。
然后发现名字在一个<div class="shop-info">
的盒子里。整个商铺信息和单个商铺信息的结构如下:
```
```
然后将鼠标放到最外面的大盒子中,即<div class="search-result-list-service">
上去,然后右键->复制->复制xpath。(如果是Google Chrome也是一样的额,只不过是英文罢了)
xpath使用前需要实例化一个HTML对象,即etree.HTML(resp.text)
```
解析
html = etree.HTML(resp.text) divs = html.xpath("//*[@id="__layout"]/div/div[3]/div/div[3]/div[4]/div[1]") ```
此时divs
里面就会包含多个子<div>
了,再利用个for循环,遍历每一个相同的div,./div[1]/div/a/div[2]/div[1]/div/text()
,就可以拿到整个页面的商铺名字了。
下面以输入sass为例,挺久之前写的代码了,思想类似,可以直接照搬过来用。
```python import requests from lxml import etree
url = "http://beijing.zbj.com/search/f/?kw=sass" resp = requests.get(url)
解析
html = etree.HTML(resp.text) divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div/div")
for div in divs: # 每一个服务商信息 price = div.xpath("./div/div/a[2]/div[2]/div[1]/span[1]/text()")[0].strip("¥") title = "sass".join(div.xpath("./div/div/a[2]/div[2]/div[2]/p/text()")) com_name = div.xpath("./div/div/a[1]/div[1]/p/text()") # [0]给放到列表里 print(com_name)
```
关于xpath的相关语法,这里只罗列一部分。
这个地方的其实要熟悉还是得多练小案例的,可以尝试着不直接复制网页中的代码,而是自己写出来提取的代码。
```basic // 表示的是后代 [] 谓语、条件 / 往下选择元素 @ 提取元素 * 任意的节点 ./ 当前结点
xpath的顺序是从1开始的
res = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()") # [@xxx=xxx] # 属性筛选
拿到属性值 :@属性
```
session与cookie
在爬取一些页面的时候往往需要用户先登录,然后才能看到其网站里面的信息。而浏览器中有个一个东西可以表示你的登录状态,这个玩意就是cookie
了。
关于cookie的详解,可以自行查资料了解一下~
在这里只需要知道这个东西可以表示你的登录状态就行,记录了cookie就不用频繁的多次登录了。
cookie的查找,可以先F12
键,然后刷新一下网页,打开工具栏中的网络
,随便点击一个请求进去,点击标头(headers),就可以看到cookie了。
如果是获取某个小说网站的书架信息,往往需要在headers里面加入cookie信息。
在看到书架信息之前需要先登录该网站,这里扯到到session(会话),就当做是一个用户向服务器发送请求,然后服务器返回信息的整个过程吧。
向某一个登录网站的api发送数据,需要用到session=requests.session()
,然后
session.post(url, data=data)
,就可以实现登录的功能了。
这里用到的api是http://passport.17k.com/login/
下面登录并获取书架返回的html代码如下: ```python import requests
会话
session = requests.session() data = { "loginName": "xxxxxxxx", "password": "xxxxxxxxx" }
登录
url = "http://passport.17k.com/login/" sp = session.post(url, data=data)
resp = session.get('http://user.17k.com/ck/author/shelf?page=1&appKey=2406394919') print(resp.json()) ``` cookie一般包装在headers里面,随请求一起发送给服务器,模板如下:
resp = request.get("http://user.17k.com/ck/author/shelf?page=1&appKey=2406394919",headers={
"Cookie":"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
})
本次的爬虫知识就写到这儿了,后续继续更新多线程以及selenium的知识吖~,如果对你有用的话,就点个赞吧~😋