我正致力于org.junit.runner.JUnitCore
抓取www.flipkart.com,在递归抓取链接中的链接后,会返回该网站中所有手机的详细信息。所有品牌都有Crawlspider
这种格式:href
,4io所以我试图将正则表达式赋予"规则"。问题是我的代码没有返回任何内容。我不知道是什么问题。
我的代码是:
mobiles/samsung~brand/pr?sid=tyy
我在from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import Rule, CrawlSpider
from scrapy.selector import HtmlXPathSelector
from flipkart.items import FlipkartItem
class FlipkartSpider(CrawlSpider):
name = "flipkart"
allowed_domains = ["Flipkart.com"]
start_urls = ["http://www.flipkart.com/mobiles"]
rules = (Rule(LinkExtractor(allow ="/^([a-z]+)(\/[a-z]{7})(\/[a-z0-9~]+)(\/[a-z\?=0-9,]+)$/"), callback = 'parse_item', follow=True), )
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.select("//div[@class='product-unit unit-4 browse-product new-design ']")
items = []
for titles in titles:
item = FlipkartItem()
item ['brand'] = titles.select("//a[@class='fk-display-block nav-section-item tpadding5 bpadding5']/@title").extract()
item ['model'] = titles.select("//a[@class='fk-display-block']/text()").extract()
item ['price'] = titles.select("//span[@class='fk-font-17 fk-bold']/text()").extract()
item ['description'] = titles.select("//li/span[@class='text']/text()").extract()
items.append(item)
return items
和pipelines.py
中没有做过任何事情。我已经初始化了settings.py
中的所有参数。
任何形式的帮助表示赞赏。提前谢谢。
任何人都可以分享他的代码,以便我可以在我的代码中查看或更正吗?请。
答案 0 :(得分:1)
您声明您感兴趣的所有链接都具有以下格式:
mobiles/samsung~brand/pr?sid=tyy,4io
在您的代码中有以下正则表达式:
/^([a-z]+)(\/[a-z]{7})(\/[a-z0-9~]+)(\/[a-z\?=0-9,]+)$/
请检查regex101.com您的正则表达式,您会发现它与您提供的示例不符。
也许以下正则表达式更符合您的需求:'sid=tyy,4io'
。至少蜘蛛会爬行页面(据我测试过)。
p.s。:除了不匹配的正则表达式之外,代码中还有其他问题/错误。首先提到for titles in titles:
循环。此错误经常出现在此站点上发布的scrapy初学者脚本中。我想知道所有这些人在哪里得到同样容易出错的代码?所以 - 你介意分享你获得这部分代码的地方吗?如果我们知道来源,也许我们可以纠正它。
编辑(添加了一些代码):
import scrapy
from scrapy.contrib.spiders import Rule, CrawlSpider
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose, Join
from scrapy.utils.markup import replace_escape_chars
class FlipkartItem(scrapy.Item):
brand = scrapy.Field()
model = scrapy.Field()
price = scrapy.Field()
description = scrapy.Field()
class FlipkartSpider(CrawlSpider):
name = "flipkart"
allowed_domains = ["www.flipkart.com"] # filtered offsite request
start_urls = ["http://www.flipkart.com/mobiles"]
rules = (
Rule(
LinkExtractor(allow ='sid=tyy,4io'),
callback = 'parse_item',
follow=True),
)
def parse_item(self, response):
products = response.xpath('//div[contains(@class,"product-unit")]')
for product in products:
l = ItemLoader(FlipkartItem(), product)
l.default_input_processor = MapCompose(lambda v: v.split(), replace_escape_chars)
l.default_output_processor = Join()
l.add_xpath('model', './/div[contains(@class,"pu-title")]//text()')
l.add_xpath('price', './/div[contains(@class,"pu-price")]//text()')
l.add_xpath('description', './/ul[contains(@class,"pu-usp")]//text()')
yield l.load_item()