首先我们打开 简书的网站链接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)