我正在尝试从 Flipkart.com 上抓取一些信息,为此我正在使用 Scrapy。我需要的信息是 Flipkart 上每个产品的信息。
我为我的蜘蛛使用了以下代码 从 scrapy.contrib.spiders 导入 CrawlSpider,规则
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.selector import HtmlXPathSelector
from tutorial.items import TutorialItem
class WebCrawler(CrawlSpider):
name = "flipkart"
allowed_domains = ['flipkart.com']
start_urls = ['http://www.flipkart.com/store-directory']
rules = [
Rule(LinkExtractor(allow=['/(.*?)/p/(.*?)']), 'parse_flipkart', cb_kwargs=None, follow=True),
Rule(LinkExtractor(allow=['/(.*?)/pr?(.*?)']), follow=True)
]
@staticmethod
def parse_flipkart(response):
hxs = HtmlXPathSelector(response)
item = FlipkartItem()
item['featureKey'] = hxs.select('//td[@class="specsKey"]/text()').extract()
yield item
我的目的是抓取每个产品类别页面(由第二条规则指定),并按照类别页面中的产品页面(第一条规则)从产品页面中抓取数据。
- 一个问题是我找不到控制抓取和抓取的方法。
- 第二个 Flipkart 在其类别页面上使用 Ajax,并在用户滚动到底部时显示更多产品。
- 我已阅读其他答案并评估 Selenium 可能有助于解决该问题。但我找不到合适的方法将其实现到这个结构中。
欢迎提出建议..:)
其他详细信息
我之前也使用过类似的方法
我使用的第二条规则是
Rule(LinkExtractor(allow=['/(.?)/pr?(.?)']),'parse_category', follow=True)
@staticmethod
def parse_category(response):
hxs = HtmlXPathSelector(response)
count = hxs.select('//td[@class="no_of_items"]/text()').extract()
for page num in range(1,count,15):
ajax_url = response.url+"&start="+num+"&ajax=true"
return Request(ajax_url,callback="parse_category")
现在我对回调“parse_category”或“parse_flipkart”使用什么感到困惑
感谢您的耐心等待
最佳答案
不知道你说找不到控制抓取和抓取的方法是什么意思。为此目的创建一个蜘蛛已经可以控制它了,不是吗?如果您创建适当的规则并正确解析响应,这就是您所需要的。如果您指的是抓取页面的实际顺序,则很可能不需要这样做。您可以按任意顺序解析所有项目,但可以通过解析项目标题上方的面包屑信息来收集它们在类别层次结构中的位置。您可以使用类似的方法来获取列表中的面包屑:
response.css(".clp-breadcrumb").xpath('./ul/li//text()').extract()
您实际上并不需要 Selenium,而且我相信对于这个简单的问题来说这有点过分了。使用浏览器(我当前使用的是 Chrome),按 F12 打开开发人员工具。转到类别页面之一,然后在开发人员窗口中打开网络选项卡。如果此处有任何内容,请单击清除按钮来清除一些内容。现在向下滚动,直到您看到正在加载其他项目,并且您将看到“网络”面板中列出的其他请求。按文档过滤它们 (1),然后单击左侧 Pane 中的请求 (2)。您可以看到请求的 URL (3) 以及需要发送的查询参数 (4)。请注意 start 参数,这将是最重要的,因为您必须多次调用此请求,同时增加此值才能获取新项目。您可以在“预览” Pane (5) 中检查响应,您将看到来自服务器的请求正是您所需要的,更多项目。您用于项目的规则也应该选取这些链接。
有关使用 Firebug 进行抓取的更详细概述,您可以查看 official documentation .
由于不需要使用 Selenium 来达到您的目的,因此我不会再讨论这一点,而只是添加一些链接来展示如何在 Scrapy 中使用 Selenium(如果需要的话):
关于python-2.7 - 使用 scrapy 从 Flipkart 上抓取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27344602/