Python 与爬行蜘蛛一起工作

Python 与爬行蜘蛛一起工作,python,scrapy,Python,Scrapy,我正在开发Crawlspider,它可以在www.flipkart.com上爬行,在递归地爬行链接后,会返回该网站上所有手机的详细信息。所有品牌都有以下格式的href:手机/samsung~brand/pr?sid=tyy,4io,因此我尝试将正则表达式设置为“Rule”。问题是我的代码没有返回任何内容。我不知道是什么问题。 我的代码是: from scrapy.contrib.linkextractors import LinkExtractor from scrapy.contrib.spi

我正在开发
Crawlspider
,它可以在www.flipkart.com上爬行,在递归地爬行链接后,会返回该网站上所有手机的详细信息。所有品牌都有以下格式的
href
手机/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,]+)$/

请检查您的正则表达式,您会发现它与您提供的示例不匹配

也许下面的正则表达式更适合您的需要:
'sid=tyy,4io'
。至少蜘蛛会抓取页面(据我测试)

p、 s:除了不匹配的正则表达式外,您的代码中还有其他问题/错误。首先要提到titles:循环中标题的
。这个错误经常出现在这个网站上发布的scrapy初学者脚本中。我想知道这些人从哪里得到了同样容易出错的代码?那么-你介意分享一下你从哪里得到的那部分代码吗?如果我们知道来源,也许我们可以纠正它

编辑(添加了一些代码):


您确定
Xpath
es是正确的并返回所需的结果吗?另外,我认为您需要将
返回项
移出
for
循环。您可以通过执行
$scrapy shell来检查
xpath
shttp://www.flipkart.com/mobiles
然后
response.xpath(xpath)
Yes当然。如果你得到了正确的输出,我已经跟随了这个链接,你介意分享你的代码吗?这样我就可以看到我错在哪里了。谢谢你的链接。我将在本周末再次访问我的计算机时共享代码。谢谢你的帮助。我还有一个问题。如何使用python将已爬网的数据存储到mysql数据库中?我已经尝试使用'sid=tyy,4io'正则表达式运行代码,它也在爬网,但仍然没有得到我想要的。你能帮忙吗?
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()