怎样抓取网页数据( 开发者工具的操作不多展开(一)——PS)
优采云 发布时间: 2021-09-24 07:03怎样抓取网页数据(
开发者工具的操作不多展开(一)——PS)
PS:这里就不多展开开发者工具的操作了。
1.2.2. 简单的想法
很多时候我们会发现爬虫有时候不是那么流畅,有时候需要添加很多细节,但是总体思路不会离开这三步。显然这还远远不够,所以还需要更详细的步骤
1.2.3. 详细思路
打开一个特定的网页,查看该网页的源代码,找到(CTRL+F)你要查找的数据是否在该网页中。
2.1. 如果是,此时打开开发者模式,点击网络,刷新。这时候你会发现,你需要的数据恰好在第一个 URL 处返回。如下
最后写代码爬取网页并使用xpath解析
2.2. 如果没有,此时需要打开开发者模式,点击网络,刷新。这时候你会发现不能像2.1那样在第一个网站中返回数据。这时,数据隐藏在其他js等文件中。(这里需要一点前端开发的基础)。我们需要找出数据存储在哪个环节,搜索方式往往是人工和经验过滤,可以先过滤XHR数据。如图:
通过上面的案例,我们过滤到了百度首页的“百度”这个词,如图:
最后写代码爬取网页,使用json解析(大多数情况下)
1.3. 需要安装的第三方库
请求:获取网络数据
lxml:解析html等格式文件中的数据2.代码示例2.1.数据在目标URL中
Demo1:爬取bilibili热点信息
from lxml import etree
import requests
# 要爬取的url,注意:在开发者工具中,这个url指的是第一个url
url = "https://www.bilibili.com/v/popular/rank/all"
# 模仿浏览器的headers
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
# get请求,传入参数,返回结果集
resp = requests.get(url,headers=headers)
# 将结果集的文本转化为树的结构
tree = etree.HTML(resp.text)
# 定义列表存储所有数据
dli = []
# 遍历所有数据
for s in range(1,101):
li = []
#根据树的路径找到对应的数据集
num = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[1]/text()") # 获取热搜排序
name = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/a/text()")# 获取标题
url = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/a/@href")#获取链接
look = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[1]/span[1]/text()")# 获取播放量
say = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[1]/span[2]/text()") # 获取评论量
up = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[1]/a/span/text()") # 获取up主
score = tree.xpath("/html/body/div[3]/div[2]/div[2]/ul/li["+str(s)+"]/div[2]/div[2]/div[2]/div/text()") # 获取综合得分
#获取数据集中的元素
li.append(num[0])
li.append(name[0])
li.append(url[0])
li.append(look[0])
li.append(say[0])
li.append(up[0])
li.append(score[0])
dli.append(li)
# 打印数据
for dd in dli:
print(dd)
运行结果如下:(本例爬取的数据还需要进一步清理,可以参考python中处理字符串的replace方法)
2.2. 数据通过其他 URL 返回
Demo2:爬取bilibili指定用户的首页信息
# 导入requests第三方库,导入报错则需要安装该库
import requests
# 要爬取的url,注意:在开发者工具中这个时候是要找数据对应的url,而不是第一个url
url = "https://api.bilibili.com/x/space/arc/search"
# 模仿浏览器的headers
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"
}
# 需要的参数
params = {
"mid": 387694560,
"pn": 1,
"ps": 25,
"index": 1,
"jsonp": "jsonp"
}
# 调用get方法,传入参数,返回结果集
resp = requests.get(url,headers=headers,params=params)
# 将结果以转化成js格式
js = resp.json()
# 获取js中我们需要的数据集
infos = js['data']['list']['vlist']
# 以下代码为遍历数据
bli = []
for info in infos:
li = []
author = info['author']
bvid = info['bvid']
pic = info['pic']
title = info['title']
li.append(author)
li.append(bvid)
li.append(pic)
li.append(title)
bli.append(li)
# 输出完整数据
for ll in bli:
print(ll)
操作结果如下:
3. 代码分析3.1. 数据在目标URL
上面代码中的URL、headers和xpath匹配都是直接在开发者工具中复制的。
注意:复制xpath的全路径:先通过开发者工具的箭头工具选择你需要的元素,在元素中右键该元素,复制即可。
注意:复制的xpath的完整路径需要进一步调整
获取标签的文本,在路径后添加/text(),获取元素标签的标签值,路径后添加/@attribute name。如果要获取多个相同的数据(例如必须获取Ranks 1, 2...)。这时候就可以在xpath中把字符串拼接起来,然后用一个循环来一一遍历。
3.2. 数据通过其他 URL 返回
这种类型的 URL 不是第一个,而是我们用数据找到的 URL。其他规则与上一条基本相同。但是在获取数据的地方,现在是解析js数据。读者可以看图对比上面的代码,就知道如何解析js数据了。
3.3 总结 上面列出的两种方法只是在使用python爬虫时遇到的最常见的方法。这并不意味着所有情况都适合。这两种情况只适用于正常情况下,但实际业务往往包括处理。Cookie、处理防盗链、多线程、多进程等,但由于本文仅针对入门级,所以本文不收录这部分内容。网上能看到的很多请求都是get和post。所以对于这两个,我们在抓取网页的时候,要注意用的是什么方法,不要搞错,检查get方法是否需要params参数,post方法是否需要form参数。4. 原理说明
其实网页中的很多数据并不是直接放入HTML中的,有些是通过js来渲染的。因此,根据这两点的不同,我们可以指定两种不同的解决方案。当数据放在HTML中时,我们使用xpath来解析数据;数据以js格式响应时,直接按照层级关系获取。
5. 项目地址
/zhizhangxuezhang/CrawlerEntryCodeExample