scrapy抓取多个页面,提取数据并保存到mysql中

时间:2015-03-30 22:46:38

标签: python mysql scrapy

嗨,有人可以帮助我,我似乎被卡住了,我正在学习如何抓取并保存到mysql中我们scrapy。我试图让scrapy抓取所有网站页面。从“start_urls”开始,但它似乎没有自动抓取所有页面只有一个,它确实用pipelines.py保存到mysql中。它还会在f = open(“urls.txt”)中提供url时抓取所有页面,并使用pipelines.py保存数据。

这是我的代码

test.py

import scrapy
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import HtmlXPathSelector
from gotp.items import GotPItem
from scrapy.log import *
from gotp.settings import *
from gotp.items import *

class GotP(CrawlSpider):
    name = "gotp"
    allowed_domains = ["www.craigslist.org"]
    start_urls = ["http://sfbay.craigslist.org/search/sss"]
    rules = [
        Rule(SgmlLinkExtractor(
            allow=('')),
            callback ="parse",
            follow=True
        )
    ]
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        prices = hxs.select("//div[@class="sliderforward arrow"]")
        for price in prices:
            item = GotPItem()
            item ["price"] = price.select("text()").extract()
            yield item 

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正在尝试遵循分页并提取结果。

在这种情况下,您可以避免使用CrawlSpider并使用常规Spider课程。

我们的想法是解析第一页,提取总结果数,计算要去的页数并将scrapy.Request个实例生成到提供s GET参数值的同一网址。

实施例:

import scrapy

class GotP(scrapy.Spider):
    name = "gotp"
    allowed_domains = ["www.sfbay.craigslist.org"]
    start_urls = ["http://sfbay.craigslist.org/search/sss"]

    results_per_page = 100

    def parse(self, response):
        total_count = int(response.xpath('//span[@class="totalcount"]/text()').extract()[0])
        for page in xrange(0, total_count, self.results_per_page):
            yield scrapy.Request("http://sfbay.craigslist.org/search/sss?s=%s&" % page, callback=self.parse_result, dont_filter=True)

    def parse_result(self, response):
        results = response.xpath("//p[@data-pid]")
        for result in results:
            try:
                print result.xpath(".//span[@class='price']/text()").extract()[0]
            except IndexError:
                print "Unknown price"

这将遵循控制台上的分页和打印价格。希望这是一个很好的起点。