有时候爬数据遇到像下面这种,数据在script标签中以javascript形式存在。
一般我们都是通过正则的方式抽取,其实还可以使用js2xml。将js转换为xml标记的文本,这样就可以通过抽取。
js文本如下
<script>
var p4p_btsinfo = "";
var g_config = {
appId: 3,
toolbar: false,
webww: true,
footer: false,
ap_mods: {
jstracker: [0.0001]
}
};
</script>
js2xml
这里要说下:
有的网页用soup = BeautifulSoup(r.content, 'lxml')
会出错,我解析了两个接口,另一个接口使用soup = BeautifulSoup(r.text, 'html.parser')
来获取soup.我把这行代码也放下面了,如果报错的话最好debug下,看看是为什么错了.
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'lxml')
# soup = BeautifulSoup(r.text, 'html.parser')
src = soup.select('head script')[0].string
src_element = js2xml.parse(src, encoding='utf-8', debug=False)
为了方便我们查看Element对象,使用下面的代码:
print(js2xml.pretty_print(src_element))
打印我们熟悉的标记语言字符串。
<program>
<var name="p4p_btsinfo">
<string></string>
</var>
<var name="g_config">
<object>
<property name="appId">
<number value="3"/>
</property>
<property name="toolbar">
<boolean>false</boolean>
</property>
<property name="webww">
<boolean>true</boolean>
</property>
<property name="footer">
<boolean>false</boolean>
</property>
<property name="ap_mods">
<object>
<property name="jstracker">
<array>
<number value="0.0001"/>
</array>
</property>
</object>
</property>
</object>
</var>
</program>
因为parse_js是lxml库的Element类对象。如果我们熟悉lxml库的话,应该知道可以使用xpath或者css定位数据。
我们想获取name=g_config节点里的appId节点中的value属性的值。获取节点属性值可以参考 python中使用XPath
number = src_element.xpath("//program/var[@name='g_config']/object/property[@name='appId']/number/@value")
print(number[0])
3
完整代码如下
cookie和user-agent参数已删除,请自行登陆后获取
import requests
from bs4 import BeautifulSoup
import js2xml
headers = {
'cookie': '',
'referer': 'https://www.taobao.com/',
'user-agent': ''
}
url = "https://s.taobao.com/search?q=%E6%89%8B%E6%9C%BA&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306"
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'lxml')
# soup = BeautifulSoup(r.text, 'html.parser')
src = soup.select('head script')[0].string
# print('---------')
# print(src)
src_element = js2xml.parse(src, encoding='utf-8', debug=False)
# print('---------')
# print(src_element)
src_tree = js2xml.pretty_print(src_element)
print('---------')
print(src_tree)
print('---------')
number = src_element.xpath("//program/var[@name='g_config']/object/property[@name='appId']/number/@value")
print(number[0])
网友评论