鱼C论坛

 找回密码
 立即注册
查看: 2059|回复: 15

[已解决]关于爬虫的小疑问

[复制链接]
发表于 2021-8-23 21:10:34 | 显示全部楼层 |阅读模式
9鱼币
今天在爬虫的时候,我根据element结构写出来的xpath表达式解析不到数据,然后找到数据包的源码,发现数据所在的结构跟element里面的结构不一样
这里问几个问题:
1.大佬们能不能解释一下element和数据包有什么关系啊?
2.那我们在爬虫的时候是应该根据element定位数据还是找到数据包定位呢?大佬们平时是怎么定位的?
3.还有就是最近在学scrapy框架,发现比起selenium的方式麻烦了很多,是否在真正项目中scrapy更优秀呢?优秀在哪里?


最佳答案
2021-8-23 21:10:35
本帖最后由 白two 于 2021-8-23 23:32 编辑
2861160067 发表于 2021-8-23 22:38
是这种大佬,麻烦您再去试一试,刚刚发的图片不显示不知道为啥


可以解析到,但不知道为啥 xpath 不行
我把网页源码保存下来在本地的文档看着写的 xpath,和根据 element 写的不一样
但是,不知道为啥返回的结果还是空列表
然后换了bs4,就能正常解析出来:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. #
  4. # headers ={
  5. #     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
  6. #     'cookie': 'hb_MA-BFF5-63705950A31C_source=www.baidu.com; _ga=GA1.2.779947586.1629010530; NTES_P_UTID=BB2HIPNo4KdwUXKZ9kIYM1Omkebmu53Y|1629010584; NTES_SESS=JB_vEDJu463hs8jXyUYRk_J6bFWPAuexS4Q9Z69PxTT_xaw1xYbLveyv8HOW7utrefHaM_ZZ64hZz5bP7yj5gUg7xThkW4M1oO.NvmQf6VgWXrtGKaQQ2VkXTf18_K8Ef9skq9A0Zebr3io3Yb.bo6mxvcdt0cfMnGCnTFnNl6l_35h7Jr69dEVthWDZu3DpUeWY6ZP81ulGe; S_INFO=1629010584|0|3&80##|taoist_two; P_INFO=taoist_two@163.com|1629010584|0|epay|00&99|sic&1627108648&epay#sic&510100#10#0#0|&0|youdaodict_client|taoist_two@163.com; _ntes_nuid=f5692e5033bacce44b5c418c6f98c274; _ntes_nnid=d8212b1a00fd27dd2b3836d19a9a1ce9,1629728232401; s_n_f_l_n3=10ca5d99d778f4f11629728232406; BAIDU_SSP_lcr=https://fishc.com.cn/; cm_newmsg=user%3Dtaoist_two%40163.com%26new%3D2%26total%3D9; NTES_CMT_USER_INFO=468769398%7C%E6%9C%89%E6%80%81%E5%BA%A6%E7%BD%91%E5%8F%8B0rYdFS%7Chttp%3A%2F%2Fcms-bucket.nosdn.127.net%2F2018%2F08%2F13%2F078ea9f65d954410b62a52ac773875a1.jpeg%7Cfalse%7CdGFvaXN0X3R3b0AxNjMuY29t; ne_analysis_trace_id=1629729616665; vinfo_n_f_l_n3=10ca5d99d778f4f1.1.0.1629728232406.0.1629729616997'
  7. # }
  8. # a = requests.get('https://war.163.com/',headers = headers)
  9. # m = a.text
  10. # with open('html1.txt','w',encoding='gbk') as f:
  11. #     f.write(m)
  12. # print(m)
  13. with open ('html1.txt','r',encoding = 'gbk') as f:
  14.     m = f.read()
  15. html_tree = BeautifulSoup(m,'lxml')
  16. tgt = html_tree.find('a',class_ = 'photo')
  17. print(tgt['title'])
复制代码


这是结果:
  1. 海军航空兵多型轰炸机挂反舰导弹飞行
复制代码


是可以解析出来的,用 bs4 没问题,为啥 xpath 会出问题我在研究研究

最佳答案

查看完整内容

可以解析到,但不知道为啥 xpath 不行 我把网页源码保存下来在本地的文档看着写的 xpath,和根据 element 写的不一样 但是,不知道为啥返回的结果还是空列表 然后换了bs4,就能正常解析出来: 这是结果: 是可以解析出来的,用 bs4 没问题,为啥 xpath 会出问题我在研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-23 21:10:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 白two 于 2021-8-23 23:32 编辑
2861160067 发表于 2021-8-23 22:38
是这种大佬,麻烦您再去试一试,刚刚发的图片不显示不知道为啥


可以解析到,但不知道为啥 xpath 不行
我把网页源码保存下来在本地的文档看着写的 xpath,和根据 element 写的不一样
但是,不知道为啥返回的结果还是空列表
然后换了bs4,就能正常解析出来:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. #
  4. # headers ={
  5. #     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36',
  6. #     'cookie': 'hb_MA-BFF5-63705950A31C_source=www.baidu.com; _ga=GA1.2.779947586.1629010530; NTES_P_UTID=BB2HIPNo4KdwUXKZ9kIYM1Omkebmu53Y|1629010584; NTES_SESS=JB_vEDJu463hs8jXyUYRk_J6bFWPAuexS4Q9Z69PxTT_xaw1xYbLveyv8HOW7utrefHaM_ZZ64hZz5bP7yj5gUg7xThkW4M1oO.NvmQf6VgWXrtGKaQQ2VkXTf18_K8Ef9skq9A0Zebr3io3Yb.bo6mxvcdt0cfMnGCnTFnNl6l_35h7Jr69dEVthWDZu3DpUeWY6ZP81ulGe; S_INFO=1629010584|0|3&80##|taoist_two; P_INFO=taoist_two@163.com|1629010584|0|epay|00&99|sic&1627108648&epay#sic&510100#10#0#0|&0|youdaodict_client|taoist_two@163.com; _ntes_nuid=f5692e5033bacce44b5c418c6f98c274; _ntes_nnid=d8212b1a00fd27dd2b3836d19a9a1ce9,1629728232401; s_n_f_l_n3=10ca5d99d778f4f11629728232406; BAIDU_SSP_lcr=https://fishc.com.cn/; cm_newmsg=user%3Dtaoist_two%40163.com%26new%3D2%26total%3D9; NTES_CMT_USER_INFO=468769398%7C%E6%9C%89%E6%80%81%E5%BA%A6%E7%BD%91%E5%8F%8B0rYdFS%7Chttp%3A%2F%2Fcms-bucket.nosdn.127.net%2F2018%2F08%2F13%2F078ea9f65d954410b62a52ac773875a1.jpeg%7Cfalse%7CdGFvaXN0X3R3b0AxNjMuY29t; ne_analysis_trace_id=1629729616665; vinfo_n_f_l_n3=10ca5d99d778f4f1.1.0.1629728232406.0.1629729616997'
  7. # }
  8. # a = requests.get('https://war.163.com/',headers = headers)
  9. # m = a.text
  10. # with open('html1.txt','w',encoding='gbk') as f:
  11. #     f.write(m)
  12. # print(m)
  13. with open ('html1.txt','r',encoding = 'gbk') as f:
  14.     m = f.read()
  15. html_tree = BeautifulSoup(m,'lxml')
  16. tgt = html_tree.find('a',class_ = 'photo')
  17. print(tgt['title'])
复制代码


这是结果:
  1. 海军航空兵多型轰炸机挂反舰导弹飞行
复制代码


是可以解析出来的,用 bs4 没问题,为啥 xpath 会出问题我在研究研究
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 21:11:16 | 显示全部楼层
我顶
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 21:13:37 | 显示全部楼层
我再顶
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-23 21:16:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 21:19:51 | 显示全部楼层
suchocolate 发表于 2021-8-23 21:16
看教程
https://github.com/Python3WebSpider/Python3WebSpider

打开了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-23 21:49:18 | 显示全部楼层
本帖最后由 白two 于 2021-8-23 21:52 编辑

1. element 里面的东西都是浏览器渲染出来的,可能它的数据来源于数据包,但是和数据包关系不大
2.看是什么网页了,动态的网页数据都在包里,就得靠抓包;静态网站都在网页源码里,就可以直接根据 element 解析网页(也有例外,个别网站源码结构和 element 不一样)
3.scrapy并发线程效率更高,而且不容易像自己写的多线程那样出问题,最高支持32并发线程好像,平时一般的小爬虫也用不到那么多线程,自己写个多线程足矣
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 22:06:07 | 显示全部楼层
白two 发表于 2021-8-23 21:49
1. element 里面的东西都是浏览器渲染出来的,可能它的数据来源于数据包,但是和数据包关系不大
2.看是什 ...

大佬,麻烦您去网易新闻网页https://war.163.com/
你用xpath解析一下每个新闻的标题,根据element当中的结构是解析不到的,但是在对应url的数据包里面确实有相应的标题文本字样,但是数据包里面文本所在的结构和element不一样,那这种情况是属于动态加载的还是属于静态页面?
动态加载的页面不是都在XHR选项卡里面吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-23 22:23:55 | 显示全部楼层
2861160067 发表于 2021-8-23 22:06
大佬,麻烦您去网易新闻网页https://war.163.com/
你用xpath解析一下每个新闻的标题,根据element当中的 ...

这种吗?可以的啊
QQ截图20210823222313.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 22:29:29 | 显示全部楼层
白two 发表于 2021-8-23 22:23
这种吗?可以的啊

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 22:35:43 | 显示全部楼层

                               
登录/注册后可看大图
是这种,大佬麻烦您再去试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 22:38:24 | 显示全部楼层
白two 发表于 2021-8-23 22:23
这种吗?可以的啊


                               
登录/注册后可看大图
是这种大佬,麻烦您再去试一试,刚刚发的图片不显示不知道为啥
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-23 23:08:41 | 显示全部楼层
2861160067 发表于 2021-8-23 22:38
是这种大佬,麻烦您再去试一试,刚刚发的图片不显示不知道为啥

可能等会,给我恶心到了,虽然它的数据在源文件里面,但是结构好像和element的有些差距,正在分析,稍等
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-23 23:42:03 | 显示全部楼层
白two 发表于 2021-8-23 23:28
可以解析到,但不知道为啥 xpath 不行
我把网页源码保存下来在本地的文档看着写的 xpath,和根据 elem ...

好的,谢谢大佬。
我应该是知道了,在我指的那个他是动态加载的,虽然在数据包中有同样文本的数据,但是他们结构是不一样的,也就是说数据包里面的文本和element那里的文本一样,但不是同一个东西,element里面那个结构关系在数据包里面是找不到的,是动态加载的。
不知道解释清楚没有
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-24 00:04:22 | 显示全部楼层
本帖最后由 白two 于 2021-8-24 00:19 编辑
白two 发表于 2021-8-23 21:10
可以解析到,但不知道为啥 xpath 不行
我把网页源码保存下来在本地的文档看着写的 xpath,和根据 elem ...


是我傻逼了,xpath 也可以解析出来,但是网页源码和 element 里面完全不一样,你得去网页源码里面定位你需要的元素

这是基于之前保存了 txt 文件的前提:

  1. from lxml import etree
  2. with open('html1.txt', 'r') as f:
  3.     m = f.read()
  4. html_tree = etree.HTML(m)
  5. tgt = html_tree.xpath('//div[@class="focus_body"]/ul[1]/li[1]/a[@class="photo"]/@title')
  6. print(tgt)
复制代码


运行结果:

  1. ['海军航空兵多型轰炸机挂反舰导弹飞行']
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-24 10:04:06 | 显示全部楼层
2861160067 发表于 2021-8-23 22:06
大佬,麻烦您去网易新闻网页https://war.163.com/
你用xpath解析一下每个新闻的标题,根据element当中的 ...

这不是能取到数据吗
无标题.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表