2861160067 发表于 2021-8-23 21:10:34

关于爬虫的小疑问

今天在爬虫的时候,我根据element结构写出来的xpath表达式解析不到数据,然后找到数据包的源码,发现数据所在的结构跟element里面的结构不一样
这里问几个问题:
1.大佬们能不能解释一下element和数据包有什么关系啊?
2.那我们在爬虫的时候是应该根据element定位数据还是找到数据包定位呢?大佬们平时是怎么定位的?
3.还有就是最近在学scrapy框架,发现比起selenium的方式麻烦了很多,是否在真正项目中scrapy更优秀呢?优秀在哪里?{:5_94:}


白two 发表于 2021-8-23 21:10:35

本帖最后由 白two 于 2021-8-23 23:32 编辑

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

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

import requests
from bs4 import BeautifulSoup
#
# headers ={
#   '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',
#   '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'
# }
# a = requests.get('https://war.163.com/',headers = headers)
# m = a.text
# with open('html1.txt','w',encoding='gbk') as f:
#   f.write(m)
# print(m)
with open ('html1.txt','r',encoding = 'gbk') as f:
    m = f.read()
html_tree = BeautifulSoup(m,'lxml')
tgt = html_tree.find('a',class_ = 'photo')
print(tgt['title'])

这是结果:
海军航空兵多型轰炸机挂反舰导弹飞行

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

2861160067 发表于 2021-8-23 21:11:16

我顶

2861160067 发表于 2021-8-23 21:13:37

我再顶

suchocolate 发表于 2021-8-23 21:16:09

2861160067 发表于 2021-8-23 21:13
我再顶

看教程
https://github.com/Python3WebSpider/Python3WebSpider

2861160067 发表于 2021-8-23 21:19:51

suchocolate 发表于 2021-8-23 21:16
看教程
https://github.com/Python3WebSpider/Python3WebSpider

打开了

白two 发表于 2021-8-23 21:49:18

本帖最后由 白two 于 2021-8-23 21:52 编辑

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

2861160067 发表于 2021-8-23 22:06:07

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

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

白two 发表于 2021-8-23 22:23:55

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

这种吗?可以的啊

2861160067 发表于 2021-8-23 22:29:29

白two 发表于 2021-8-23 22:23
这种吗?可以的啊

2861160067 发表于 2021-8-23 22:35:43

https://imgtu.com/i/hiVEIU是这种,大佬麻烦您再去试试

2861160067 发表于 2021-8-23 22:38:24

白two 发表于 2021-8-23 22:23
这种吗?可以的啊

https://z3.ax1x.com/2021/08/23/hiV4e0.md.png是这种大佬,麻烦您再去试一试,刚刚发的图片不显示不知道为啥

白two 发表于 2021-8-23 23:08:41

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

可能等会,给我恶心到了,虽然它的数据在源文件里面,但是结构好像和element的有些差距,正在分析,稍等

2861160067 发表于 2021-8-23 23:42:03

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

好的,谢谢大佬。
我应该是知道了,在我指的那个他是动态加载的,虽然在数据包中有同样文本的数据,但是他们结构是不一样的,也就是说数据包里面的文本和element那里的文本一样,但不是同一个东西,element里面那个结构关系在数据包里面是找不到的,是动态加载的。
不知道解释清楚没有

白two 发表于 2021-8-24 00:04:22

本帖最后由 白two 于 2021-8-24 00:19 编辑

白two 发表于 2021-8-23 21:10
可以解析到,但不知道为啥 xpath 不行
我把网页源码保存下来在本地的文档看着写的 xpath,和根据 elem ...

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

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

from lxml import etree
with open('html1.txt', 'r') as f:
    m = f.read()
html_tree = etree.HTML(m)
tgt = html_tree.xpath('//div[@class="focus_body"]/ul/li/a[@class="photo"]/@title')
print(tgt)

运行结果:

['海军航空兵多型轰炸机挂反舰导弹飞行']

wp231957 发表于 2021-8-24 10:04:06

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

这不是能取到数据吗
页: [1]
查看完整版本: 关于爬虫的小疑问