使用 CrawlSpider
Working with CrawlSpider
我正在研究 Crawlspider
,它会抓取 www.flipkart.com 并递归抓取链接中的链接 returns 该网站中所有手机的详细信息。所有品牌都有这种格式的 href
:mobiles/samsung~brand/pr?sid=tyy
,4io 所以我尝试将正则表达式提供给 "Rule"。问题是我的代码没有返回任何东西。我不知道是什么问题。
我的代码是:
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
中没有做任何事情。我已经初始化了items.py
中的所有参数。
任何形式的帮助表示赞赏。提前致谢。
任何人都可以分享他的代码,以便我可以查看或更正我的代码吗?请。
您声明您感兴趣的所有链接都采用以下格式:
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.: 除了不匹配的正则表达式之外,您的代码中还有其他 problems/errors。首先要提到 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()
我正在研究 Crawlspider
,它会抓取 www.flipkart.com 并递归抓取链接中的链接 returns 该网站中所有手机的详细信息。所有品牌都有这种格式的 href
:mobiles/samsung~brand/pr?sid=tyy
,4io 所以我尝试将正则表达式提供给 "Rule"。问题是我的代码没有返回任何东西。我不知道是什么问题。
我的代码是:
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
中没有做任何事情。我已经初始化了items.py
中的所有参数。
任何形式的帮助表示赞赏。提前致谢。
任何人都可以分享他的代码,以便我可以查看或更正我的代码吗?请。
您声明您感兴趣的所有链接都采用以下格式:
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.: 除了不匹配的正则表达式之外,您的代码中还有其他 problems/errors。首先要提到 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()