xpath爬取简书 摄影专题里的最新收录 文章的详情及图片

首先我们打开 简书的网站链接https://www.jianshu.com/

这里写图片描述

找到下方的摄影栏目并点击

这里写图片描述

进入界面 这个就是摄影栏目里面的最新收录的所有文章

这里写图片描述

然后我们去检测 我们要爬取当前页面的url地址 所以点击键盘的F12键 我们要爬取的是当前页面的 例:”花言巧语”标题和当点击它的跳转超链接

点击Network选项

这里写图片描述

我们在第三栏会 发现各种的按钮 我们可以点击ALL 或者 XHR配合着使用

这里写图片描述

然后我们点击XHR 并刷新当前页面 会发现Name一栏会出现很多链接 我们点击第一个链接 它是以.json结尾的

这里写图片描述
这里写图片描述

我们查看上方链接末尾参数会显示page=1

这里写图片描述

然后我们查看一下规律 我们滑动页面就会发现最后一栏会多了一个链接 我们点击多的这个链接就会发现 末尾的参数 page=2 那么也就是说我们当前处于在 当前页面的第二页内容

这里写图片描述
这里写图片描述

我们点击这个page=2的链接就会显示当前的所有关于这个里面的配置

这里写图片描述

滑动到第三页

这里写图片描述

点击这个链接 就是第三页的配置

这里写图片描述

我们把page=1和page=2和page=3这三个链接都复制并打开会发现三个链接的内容是不一样的 此时我们知道这个页面是javascript分为了多个页的

第一页链接:https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1

第二页链接:https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=2

第三页链接:https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=3

这就是第一,二,三页的内容

这里写图片描述
这里写图片描述
这里写图片描述

然后我们开始绘制我们的代码

#首先导入我们的requests模块
import requests
#绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"

然后我们设置我们的header报头 这个代表模仿浏览器观看内容的协议 我们在浏览器中按f12键 点击Network刷新页面点击底部的第一个链接

这里写图片描述

#首先导入我们的requests模块
import requests
#绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}

然后我们发起请求 并获得响应 并打印测试是否成功 如果成功 会在终端中 显示200字符

#首先导入我们的requests模块
import requests
#绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}
#我们发起请求 并获得响应
response = requests.get(url,headers=header)
#测试成功
print(response.status_code)

这里写图片描述

这时 说明我们链接是有效的 我们继续开始解析我们页面中 我们要获取当前页面 第一页中的 标题下点击跳转的超链接

首先我们回到网站 按F12键查看我们的页面里面的html元素因为我们用xpath匹配 所以通俗的讲我们首先要找当前元素的”大包含” 所以要找到我们 选中的内容的父节点 也就是包含这个标签的这个块去匹配里面的内容

注:为什么我们不每次都把路径写全去获取里面的内容 因为我们要节省代码内容 因为每次都要写个for循环 这样比较麻烦所以一个for循环 然后在解析里面的内容会方便很多

我们选中我们要获得的标题链接

这里写图片描述

发现我们这个a标签 是以这么一个形式为包含 ul包含着li li包含着a标签 我们要获得a标签 就要用etree先获取这个对象li这个对象 并通过匹配解析这个a标签

所以我们要整理一下我们的代码

#首先导入我们的requests模块
import requests
#在导入lxml里面的etree 它代表把html文本生成对象
from lxml import etree

#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}

#定义一个函数
def qingqiu(url):   
    #我们发起请求 并获得响应
    response = requests.get(url,headers=header)
    #将这个html文本生成etree对象
    dx = etree.HTML(response.text)
    #打印dx这个变量 以代表测试确认
    print(dx)


if __name__ == '__main__':
    #绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
    url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
    #调用这个函数
    qingqiu(url)

这里写图片描述

紧接着用xpath解析这个对象

#首先导入我们的requests模块
import requests
#在导入lxml里面的etree 它代表把html文本生成对象
from lxml import etree

#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}

#定义一个函数
def qingqiu(url):   
    #我们发起请求 并获得响应
    response = requests.get(url,headers=header)
    #将这个html文本生成etree对象
    dx = etree.HTML(response.text)
    #用xpath解析这个对象 
    jx = dx.xpath('//ul[@class="note-list"]'/li)
    #测试打印这个解析路径
    print(jx)


if __name__ == '__main__':
    #绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
    url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
    #调用这个函数
    qingqiu(url)

解析含义:用xpath解析这个对象 然后让我们分析下这个解析的路径首先写个括号和单引号(”)在括号单引号里面写入(‘//’)代表任意下的标签 我们找到ul 所以(‘//ul’)然后找到 ul里的class 名字并写入 写class首先要写一对列表(‘//ul[class=”note-list”]’)在等于号后面写一对双引号写class的类名通常 我们尽量不要手动输入 直接 在浏览器标签里面复制 有时忽略空格时会报错这里写图片描述

紧接着找到li 所以写li之前要写个/代表当前下面的li(‘//ul[class=”note-list”]/li’)

这里写图片描述

发现我们获取到的是一个etree的li对象 li里面包含着我们要获取的标题链接

我们首先将这解析的对象一个一个遍历出来 在进行解析

这里写图片描述

进行解析

我们首先找到网站简书 并检查 点小鼠标 看看标题这个标签在哪个位置这里写图片描述

这时我们会看到我们将要获取到的链接在 a标签的href里面 这时我们用xpath解析这个a标签 我们看下图并观察里面的含义

#首先导入我们的requests模块
import requests
#在导入lxml里面的etree 它代表把html文本生成对象
from lxml import etree

#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}

#定义一个函数
def qingqiu(url):   
    #我们发起请求 并获得响应
    response = requests.get(url,headers=header)
    #将这个html文本生成etree对象
    dx = etree.HTML(response.text)
    #用xpath解析这个对象 
    jx = dx.xpath('//ul[@class="note-list"]'/li)
    #把jx对象 一个一个遍历
    for i in jx:
    #然后我们用xpath解析 .代表上级的li目录 //任意下的a标签 [@class="title"]取class里的title名 /标签下的 @代表取链接属性 href的链接 
        lj = i.xpath('.//a[@class="title"]/@href')
        #打印链接
        print(lj)


if __name__ == '__main__':
    #绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
    url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
    #调用这个函数
    qingqiu(url)

运行一下 我们发现这些链接用列表包括着 而且还不完全 没有协议和域名 只是个路径

这里写图片描述

所以我们要将 这个路径补全变成链接形式 可以获取的url

所以我们要导入一个模块 它是urllib里的一个编码解析补全方法

#首先导入我们的requests模块
import requests
#在导入lxml里面的etree 它代表把html文本生成对象
from lxml import etree
#导入urllib里面的编码解析补全模块
import urllib.parse

#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}

#定义一个函数
def qingqiu(url):   
    #我们发起请求 并获得响应
    response = requests.get(url,headers=header)
    #将这个html文本生成etree对象
    dx = etree.HTML(response.text)
    #用xpath解析这个对象 
    jx = dx.xpath('//ul[@class="note-list"]'/li)
    #把jx对象 一个一个遍历
    for i in jx:
    #然后我们用xpath解析 .代表上级的li目录 //任意下的a标签 [@class="title"]取class里的title名 /标签下的 @代表取链接属性 href的链接 
        lj = i.xpath('.//a[@class="title"]/@href')
        #用编码补全方法 将response里的url和lj里的路径进行互补拼接
        pj = urllib.parse.urljoin(response.url,lj)
        #并打印
        print(pj)



if __name__ == '__main__':
    #绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
    url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
    #调用这个函数
    qingqiu(url)

我们运行一下代码

这里写图片描述

运行一下发现报错了好像少了什么 我们在整理下代码 我们在补全链接时 由于它是列表是无序的 所以我们要给它标记第0位 在去拼接

#首先导入我们的requests模块
import requests
#在导入lxml里面的etree 它代表把html文本生成对象
from lxml import etree
#导入urllib里面的编码解析补全模块
import urllib.parse

#这个就是header的报头 它必须是字典的形式
header = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
}

#定义一个函数
def qingqiu(url):   
    #我们发起请求 并获得响应
    response = requests.get(url,headers=header)
    #将这个html文本生成etree对象
    dx = etree.HTML(response.text)
    #用xpath解析这个对象 
    jx = dx.xpath('//ul[@class="note-list"]'/li)
    #把jx对象 一个一个遍历
    for i in jx:
    #然后我们用xpath解析 .代表上级的li目录 //任意下的a标签 [@class="title"]取class里的title名 /标签下的 @代表取链接属性 href的链接 
        lj = i.xpath('.//a[@class="title"]/@href')[0]
        #用编码补全方法 将response里的url和lj里的路径进行互补拼接
        pj = urllib.parse.urljoin(response.url,lj)
        #并打印
        print(pj)



if __name__ == '__main__':
    #绘制我们的目标url我们写入的是page=1所以 就先爬取第一页的所有文章详情 后续我们逐步更改代码并爬取简书所有的页
    url = "https://www.jianshu.com/c/7b2be866f564?order_by=added_at&page=1"
    #调用这个函数
    qingqiu(url)

运行一下

这里写图片描述

这时我们获取的每个链接 按ctrl按键 点击链接都可以获取到里面的详情页

待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值