Python 2.7 抓取javascript生成的链接
我正在使用Scrapy抓取一个网站,我需要抓取的一个链接似乎是由页面中的一小段Javascript代码生成的,如下所示:Python 2.7 抓取javascript生成的链接,python-2.7,web-scraping,scrapy,Python 2.7,Web Scraping,Scrapy,我正在使用Scrapy抓取一个网站,我需要抓取的一个链接似乎是由页面中的一小段Javascript代码生成的,如下所示: <!-- var prefix = 'mailto:'; var suffix = ''; var attribs = ''; var path = 'hr' + 'ef' + '='; var addy59933 = 'HR-Cologne' + '&
<!--
var prefix = 'mailto:';
var suffix = '';
var attribs = '';
var path = 'hr' + 'ef' + '=';
var addy59933 = 'HR-Cologne' + '@';
addy59933 = addy59933 + 'scor' + '.' + 'com';
var addy_text59933 = 'Submit your application';
document.write( '<a ' + path + '\'' + prefix + addy59933 + suffix + '\'' + attribs + '>' );
document.write( addy_text59933 );
document.write( '<\/a>' );
//-->
除非您从浏览器查看页面,否则链接不会显示,但我需要我的爬行器能够以任何方式刮取它。由于代码嵌入到页面中,我想获取链接,然后从那里重新组装链接url,但是文本的格式我不熟悉
有更好的方法吗
编辑:刚刚发现这些是HTML字符实体。我仍然想知道是否有更好的方法来克服这种困惑。这里有一个解决方案:
然后赋值改变一些变量的值,混合使用字符串和变量。连接变量标识符的%(identifidername)s
,以及字符串的字符串值
>>> # identifiers are assigned other string values
... assigns = {}
>>> for assign in js.xpath('.//assign'):
... value = u"".join(['%%(%s)s' % el.text if el.tag=='identifier' else el.text
... for el in assign.xpath('./right//*[self::string or self::identifier]')])
... key = assign.xpath('string(left/identifier)')
... assigns[key] = value
...
>>> pprint.pprint(assigns)
{'addy59933': u'%(addy59933)sscor.com'}
更新变量dict“应用”赋值
>>> # update variables dict with new values
... for key, val in assigns.items():
... variables[key] = val % variables
...
>>> pprint.pprint(variables)
{'addy59933': u'HR-Cologne@scor.com',
'addy_text59933': u'Submit your application',
'attribs': u'',
'path': u'href=',
'prefix': u'mailto:',
'suffix': u''}
>>>
函数参数位于参数
节点下(XPath//arguments/*
):
使用Scrapy选择器
:
>>> from scrapy.selector import Selector
>>> selector = Selector(text="".join(arguments), type="html")
>>> selector.xpath('.//a/@href').extract()
[u'mailto:HR-Cologne@scor.com']
>>>
Scrapy不能处理这个案子。您需要smth来运行此js代码并生成链接。一种选择是使用真正的基于浏览器的工具,如。实际上,您可以从spider启动它,获取链接,然后关闭浏览器。但是,我很确定,这会使事情变慢。可能的复制只会对这种特殊的混淆有效,但是,无论如何,这是一个非常好的解决方案!事实上,@alecxe,我希望将Javascript代码的一些简单而基本的解释构建到js2xml中(欢迎贡献!),而XML模式还不是那么令人满意。但是(通过
js2xml.jsonlike.getall()
)获取字符串、对象和数组已经是可能的,而且非常有用。但是,它不会取代Javascript解释器
>>> # update variables dict with new values
... for key, val in assigns.items():
... variables[key] = val % variables
...
>>> pprint.pprint(variables)
{'addy59933': u'HR-Cologne@scor.com',
'addy_text59933': u'Submit your application',
'attribs': u'',
'path': u'href=',
'prefix': u'mailto:',
'suffix': u''}
>>>
>>> # interpret arguments of document.write()
... arguments = [u"".join(['%%(%s)s' % el.text if el.tag=='identifier' else el.text
... for el in arg.xpath('./descendant-or-self::*[self::string or self::identifier]')])
... for arg in js.xpath('.//arguments/*')]
>>>
>>> pprint.pprint(arguments)
[u"<a %(path)s'%(prefix)s%(addy59933)s%(suffix)s'%(attribs)s>",
u'%(addy_text59933)s',
u'</a>']
>>>
>>> # apply string formatting replacing identifiers
... arguments = [arg % variables for arg in arguments]
>>>
>>> pprint.pprint(arguments)
[u"<a href='mailto:HR-Cologne@scor.com'>",
u'Submit your application',
u'</a>']
>>>
>>> import lxml.html
>>> import lxml.etree
>>>
>>> doc = lxml.html.fromstring("".join(arguments))
>>> print lxml.etree.tostring(doc)
<a href="mailto:HR-Cologne@scor.com">Submit your application</a>
>>>
>>> from scrapy.selector import Selector
>>> selector = Selector(text="".join(arguments), type="html")
>>> selector.xpath('.//a/@href').extract()
[u'mailto:HR-Cologne@scor.com']
>>>