我正在尝试从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
我的意图是抓取每个产品类别页面(由第二条规则指定)并按照类别页面中的产品页面(第一条规则)从产品页面中抓取数据。
欢迎提出建议.. :)
我之前使用过类似的方法
我使用的第二条规则是
规则(LinkExtractor(允许= [' /(。?)/ pr?(。?)']),' parse_category',关注= 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"
感谢您的耐心
答案 0 :(得分:3)
当您说无法找到控制抓取和抓取的方法时,不确定您的意思。为此目的创建蜘蛛已经控制了它,不是吗?如果您创建了正确的规则并正确解析了响应,那就是您所需要的。如果您指的是抓取页面的实际顺序,您很可能不需要这样做。您可以按任何顺序解析所有项目,但通过解析项目标题上方的 breadcrumb 信息,在类别层次结构中收集它们的位置。你可以使用这样的东西来获取列表中的痕迹:
response.css(".clp-breadcrumb").xpath('./ul/li//text()').extract()
你实际上并不需要Selenium,我相信这对这个简单的问题来说太过分了。使用浏览器(我当前使用的是Chrome),按F12打开开发人员工具。转到其中一个类别页面,然后在开发人员窗口中打开网络选项卡。如果此处有任何内容,请单击清除按钮以清除一些内容。现在向下滚动,直到您看到正在加载其他项目,并且您将看到网络面板中列出的其他请求。通过 Documents (1)过滤它们,然后单击左窗格中的请求(2)。您可以看到请求的URL(3)以及需要发送的查询参数(4)。请注意 start 参数,这将是最重要的参数,因为您必须多次调用此请求,同时增加此值以获取新项目。您可以在预览窗格(5)中检查响应,您将看到来自服务器的请求正是您所需要的,更多项目。您用于项目的规则也应该选择这些链接。
有关使用Firebug进行抓取的更详细概述,您可以查看official documentation。
由于没有必要为您的目的使用Selenium,我将不会涵盖这一点,只是添加一些链接,显示如何使用Selenium和Scrapy,如果需要的话: