python爬取的数据由js函数生成,而又不在phantomjs中,怎么处理?

问题描述

在抓取市长信箱里面的 来信类别(投诉、建议、咨询、表扬) 数据:http://www.xf.gov.cn/network/...。在index页中只需要提取到img的src属性,就可获得对应的信件类别。但进行元素审查后发现,数据是由javascript生成的:
![图片描述

采取的措施

此部分数据用常规方法无法直接获取,于是分别采用了:

1.抓包分析;

2.selenium驱动phantomjs来静态化页面获取数据;

测试结果分别:

1.没有找到对应的特定js数据;

2.静态化渲染后的网页,通过数据提取(re方法和soup方法)、保存网页分析发现,提取到的数据所网页显示不一致,不能对应上。

测试使用的代码如下:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import requests

from selenium import webdriver

from bs4 import BeautifulSoup

import re

url = 'http://www.xf.gov.cn/network/zfxfxx/index.shtml'

browser = webdriver.PhantomJS(executable_path=r'F:\Pyworkspace\PhantomJS\bin\phantomjs.exe')

browser.get(url)

data = browser.page_source

browser.close()

# print(data)

with open('get-xx.html','w',encoding='utf-8') as f:

f.write(data)

soup = BeautifulSoup(data,'lxml')

# imgs = soup.select('img')

imgs = soup.select('img[width="39"]')

imgs2 = re.findall('<img src="/images/mail_(\d).gif" width="40" height="22" />', data)

imgs3 = [imgs2[i] for i in range(len(imgs2)) if i%5==0]

print(len(imgs))

print(imgs3)

求助的问题

为此求教:
1.如何抓取此案例中的 信件类别 数据?
2.如何处理selenium获取的数据与显示不一致的情形?
3.抓取动态生成的数据是否还有其他高效的办法?

回答:

1.对于js生成的内容,使用phantomjs是一种方式。phantomjs本身就是一个浏览器可以执行js,我没有遇到过,输出的页面内同和chrome打开不一致的情况。如果真的不一致,检查下phantomjs的参数设置,是否禁用了什么家在项目。

2.如果你可以看懂js,并且发现其中的内容是纯js,不依靠浏览器的windows属性,那么可以使用js2py这个可以直接运行js的python库。

3.效率是个大问题,也可以尝试使用pyv8去解析js,但是总之,需要执行js,必然需要启动js的解析器或者说运行环境。这个总是很耗资源。

回答:

element = browser.find_element_by_xpath('/html/body/div[4]/table/tbody/tr[2]/td/table[2]/tbody/tr[6]/td[1]/img')
src = element.get_attribute('src')
src 就是这个标签的 src 属性

页面里面的类别确实是使用 js 生成的,调用 browser.get(url) 方法后就可以在渲染好的页面里面查找元素了,上面那个 xpath 是随便找了其中的一个作为演示

回答:

有啊,Chrome headless

以上是 python爬取的数据由js函数生成,而又不在phantomjs中,怎么处理? 的全部内容, 来源链接: utcz.com/a/157655.html

回到顶部