我试图抓住这个网站:http://www.kaymu.com.ng/。
HTML I'抓取的部分是这样的:
<ul id="navigation-menu">
<li> some content </li>
<li> some content </li>
...
<li> some content </li>
</ul>
这是我的蜘蛛:
class KaymuSpider(Spider):
name = "kaymu"
allowed_domains = ["kaymu.com.ng"]
start_urls = [
"http://www.kaymu.com.ng"
]
def parse(self, response):
sel = response.selector
menu = sel.xpath('//ul[@id="navigation-menu"]/li')
菜单中只有列表中的最后一个li元素。当语法选择所有li元素时,我不确定它为什么会这样做。请建议可能出错的地方,谢谢!
答案 0 :(得分:2)
问题是菜单是在执行javascript的浏览器的帮助下动态构建的。 Scrapy
不是浏览器,也没有内置的javascript引擎。
希望有一个包含javascript菜单对象数组的script
标记。我们可以找到所需的script
标记,提取javascript数组,在json
module的帮助下将其加载到Python列表中,然后打印出菜单项名称。
$ scrapy shell http://www.kaymu.com.ng/
In [1]: script = response.xpath("//script[contains(., 'categoryData')]/text()").extract()[0]
In [2]: import re
In [3]: pattern = re.compile(r'var categoryData = (.*?);\n')
In [4]: data = pattern.search(script).group(1)
In [5]: import json
In [6]: data = json.loads(data)
In [7]: for item in data:
....: print item['name']
....:
Fashion
Jewelry & Watches
Health & Beauty
Sporting Goods
Mobile Phones & Tablets
Audio, Video & Gaming
Computers, Laptops & Accessories
Appliances, Furniture & Decor
Books & Media
Babies & Kids
Food & Beverages
Other