请问这种网页是不是 js 加密的?应该如何获取数据?

2021-02-15 12:38:29 +08:00
 maloneleo88
http://zq.win007.com/analysis/1964531cn.htm

学了几天 python,实战败了,这种动态的 requests 不到,各种错误。

最后试了 selenium,可以拿到数据,也可以分析,但是太慢了,花费时间和人力没区别。

作为一枚小白,怎样才能拿到这种实施响应的数据?我觉得这个不是 ajax 请求到的 json 吧?也不是普通的 js 脚本。

这里是不是还有加密信息?我想得到对赛往绩的数据,应该从哪个地方入手?
这种页面数据,按网上的方法,搜索不到相关的 js 文件,望大佬不吝赐教。!!!
4750 次点击
所在节点    Python
39 条回复
maloneleo88
2021-02-15 16:14:01 +08:00
@musi 这些概念都是很模糊。十几年前也做过网页玩,不可同日而语。难,岁数大了脑袋也不好用了。从头学是不可能从头学了,学会了就该 40 了。主要目标是干点什么,马上能用的起来就行。有些实在爬不了的只能用 selenium 了,毕竟简单,就是太慢。

我再去埋汰钻研几小时。早来问的话就不需要花 2 天学 selenium 了。 贴段昨天写的,很乱,有点像狗啃的。

import requests
import re
from selenium import webdriver
from lxml import etree
from time import sleep
#无头浏览模式
from selenium.webdriver.firefox.options import Options
options = Options()
options.add_argument('--headless')

#定义解析详情页函数
def analysis():
bro = webdriver.Firefox(options=options)
#定义要访问的目标
analysislink = vlink
#打开浏览器访问
bro.get(analysislink)

#获取源码数据
page_text = bro.page_source

#解析数据。实例化 etree
tree = etree.HTML(page_text)
#获取主队名称,链接,本次得分
homeName = tree.xpath('//div[@class="analyhead"]/div[@class="home"]/a/text()')[0]
homeLink = tree.xpath('//div[@class="analyhead"]/div[@class="home"]/a/@href')[0]
homeScore = tree.xpath('//div[@class="end"]/div[1]/text()')[0]
#获取客队名称,链接,本次得分
guestName = tree.xpath('//div[@class="analyhead"]/div[@class="guest"]/a/text()')[0]
guestLink = tree.xpath('//div[@class="analyhead"]/div[@class="guest"]/a/@href')[0]
guestScore = tree.xpath('//div[@class="end"]/div[3]/text()')[0]
# print(homeName,guestName,homeLink,guestLink,homeScore,guestScore)

#获取上一次比赛主队的 ID 链接,客队的 ID 链接,双方比分,截取上次主队得分,截取上次客队得分。
try:
last_homeLink = tree.xpath('//div[@id="v"]//tr[3]/td[3]/a/@href')[0]
last_guestLink = tree.xpath('//div[@id="v"]//tr[3]/td[6]/a/@href')[0]
lastScore = tree.xpath('//div[@id="v"]//tr[3]/td[4]/a/font/text()')[0]
last_homeScore = lastScore[0]
last_guestScore = lastScore[-1]

#a1 本次主队链接+本次主队得分。a2 本次客队链接+本次客队得分,b1 上次主队链接+得分,b2 上次客队链接+得分
a1 = homeLink + homeScore
a2 = guestLink + guestScore
b1 = last_homeLink + last_homeScore
b2 = last_guestLink + last_guestScore
#如果本次主队链接+得分等于上次主队链接+得分或者等于上次客队链接+得分
#然后看本次客队链接+得分是否等于上次主队链接+得分或客队链接+得分
#如果符合这两个条件,续写入 saiguo.html 相关信息(这里还没有给链接添加超链)
if a1 == b1 or a1 ==b2:
if a2 == b1 or a2 == b2:
print(homeName + ' ' + lastScore + ' ' + guestName + '\n')
print(analysislink + '\n')
with open('./saiguo.html','a') as fp:
fp.write(homeName + ' ' + lastScore + ' ' + guestName + '\n')
fp.write(analysislink + '\n')
sleep(2)
bro.close()
else:
bro.quit()
else:
bro.quit()
#如果没有找到上一次的对往战绩则睡眠 1 秒然后退出浏览器
except:
bro.close()





if __name__ == "__main__":
#浏览器伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68'
}
kw = input('输入赛程年月日采集数据:')
#response 函数为第一次抓取的完赛列表
response = requests.get('http://bf.win007.com/football/Over_' + kw + '.htm',headers = headers)
#列表编码为 gb2312,所以需要转一下为 GBK,负责无法正常显示
response.encoding = 'GBK'
#转换的文字信息存入 page 变量
page = response.text

#提取比赛分析数字,定义正则表达,第二行找到所有
pattern = r'analysis\(([\s\S]*?)\)'
numbers = re.findall(pattern,page,re.S)
for vlink in numbers:
#拼接处完整 URL
vlink = 'http://zq.win007.com/analysis/' + vlink + 'cn.htm'
analysis()
print('采集完成!')
v2sir
2021-02-15 16:15:32 +08:00
@maloneleo88 你也知道懒得搭理人? 你 requests 开始连 UA 都不加, 你叫我怎么想? 我第一个反应就是你是不是在消遣人。
musi
2021-02-15 16:16:24 +08:00
@maloneleo88 selenium 如果你电脑内存大的话可以开多进程,也就是多个浏览器实例,我之前用 selenium hub 一次开了二十多个,稍微快了一点,重要的是这种方法可以安装浏览器插件对网页进行操作
blodside
2021-02-15 18:24:08 +08:00
@v2sir 大家都是从不会开始的,大过年的老哥别那么大火气了
codists
2021-02-15 18:39:21 +08:00
```python
from selenium import webdriver

url = 'http://zq.win007.com/analysis/1964531cn.htm'
browser = webdriver.Chrome()
browser.get(url)
try:
tbody = browser.find_elements_by_css_selector('#table_v tr')
for td in tbody[2:]:
print(td.text.split(' '))
except:
print('NoSuchElement')

```
输出示例:
```python
['墨西乙', '20-09-14', '塞拉亚', '3-0(1-0)', '3-3', '亚特兰特 1', '1.03', '半球', '0.79', '1.95', '3.17', '3.70', '负', '输', '大']
['墨西乙', '20-01-26', '塞拉亚', '1-0(1-0)', '4-5', '亚特兰特', '1.08', '平 /半', '0.76', '2.45', '2.68', '3.11', '负', '输', '小']
['墨西乙', '19-10-25', '1 亚特兰特', '2-1(0-1)', '3-2', '塞拉亚 1', '1.06', '半球', '0.76', '2.05', '3.11', '3.45', '胜', '赢', '大']
['墨西乙', '19-03-16', '亚特兰特', '1-2(1-1)', '3-1', '塞拉亚', '0.82', '半 /一', '1.02', '1.61', '3.60', '4.93', '负', '输', '大']
['墨西乙', '18-10-21', '2 塞拉亚', '1-0(1-0)', '1-3', '亚特兰特 1', '1.03', '平手', '0.81', '2.67', '3.11', '2.45', '负', '输', '小']
['墨西乙', '18-01-21', '塞拉亚', '2-1(2-1)', '2-4', '亚特兰特', '0.96', '平 /半', '0.86', '2.14', '3.13', '3.19', '负', '输', '大']
['墨西乙', '17-08-05', '亚特兰特', '1-0(0-0)', '3-3', '塞拉亚', '1.12', '平 /半', '0.71', '2.36', '3.07', '2.82', '胜', '赢', '小']
['墨西乙', '17-02-04', '亚特兰特', '1-2(1-2)', '6-2', '塞拉亚', '0.85', '半球', '0.97', '1.87', '3.29', '3.84', '负', '输', '大']
['墨西乙', '16-11-27', '塞拉亚', '0-0(0-0)', '7-3', '亚特兰特', '0.82', '半球', '1.02', '1.84', '3.35', '3.83', '平', '赢', '小']
['墨西乙', '16-11-24', '亚特兰特', '1-0(0-0)', '3-0', '塞拉亚', '0.94', '平 /半', '0.90', '2.11', '3.15', '3.15', '胜', '赢', '小']
['近', '10', '场,', '胜出', '3', '场,平局', '1', '场,输', '6', '场,', '胜率:30%', '赢盘率:40%', '大球率:50%', '单率:90%']
```
gimp
2021-02-15 19:31:52 +08:00
“不耻下问” 意思是指向地位、学问不如自己的人请教而不感到丢面子。

向别人问问题应该用 “不吝赐教”
qazwsxkevin
2021-02-15 19:44:22 +08:00
学习是一回事,
如果真要拿这个做什么事情,体育数据方面还真不如直接买数据回来划算,如飞 jing,sopr*rader 之类,比起去爬这些网页要丰富
Lemeng
2021-02-15 22:02:49 +08:00
怎么评论区好像吵起来了?
www5070504
2021-02-15 22:05:02 +08:00
不耻下问 有意思嗷
learningman
2021-02-15 22:19:42 +08:00
@blodside 但我再菜逼的时候也不会像楼主这样生猛啊
这种骂你一句里面都是有有用的信息的,算指导的
xJogger
2021-02-15 22:26:50 +08:00
@sairoa
+1
复制为 curl 请求,再用 https://curl.trillworks.com/ 转成 python 代码简直太实用了,好多机械性步骤都省了。
LudwigWS
2021-02-15 22:30:28 +08:00
@gimp 应该说请不吝赐教
maloneleo88
2021-02-15 22:33:16 +08:00
@musi 嗯,好处就是用处广泛。但跟直接拿数据响应没法比啊,速度差太多了。

@blodside 好的。

@codists 谢谢雄对,在研究筛选数据。

@qazwsxkevin 就是爱好,喜欢看足球篮球,有时候也玩,那种数据类卖的很贵吧。也没盈利目的。

@gimp 那就不耻上问吧,呵呵


问问题,而已。 你帮我, 我帮他。。

愿意怼人玩去微博不好么,没别的,就是看不惯有些人
maloneleo88
2021-02-15 22:36:57 +08:00
@xJogger
@sairoa

谢谢,随后研究下吧,看起来有点深奥。
maloneleo88
2021-02-15 22:44:03 +08:00
不吝赐教,主楼就说了,不要咬文嚼字了

众生百相~ :D
qazwsxkevin
2021-02-15 23:47:09 +08:00
@maloneleo88 不知道价格,只是知道国内有几家这样的网站是向这些相同的数据公司买的数据(貌似有版权)
maloneleo88
2021-02-16 01:26:47 +08:00
@qazwsxkevin 纯属个人喜好,飞鲸,纳米这些数据公司有卖接口,少说一年几万,太贵了
Cusmate
2021-02-16 19:10:11 +08:00
第一层楼主的回复竟有点别致
maloneleo88
2021-02-16 19:28:03 +08:00
刚刚把这个爬虫彻底写好了(实际是三个,前,今,后),包括异常。

用了一个星期从什么也不会到 requests 找不到数据,selenium (死慢),再到昨天来问问题,终于拨云见日。

隆重感谢
@matrix67
@gongym
@darer
@sairoa

简单的爬虫看来以后我能照着这个框架慢慢举一反三了。感谢大家! 万分感谢,这几天天天就睡五个小时没白熬~欣喜至极!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/753378

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX