将值传递给scrapy回调

时间:2016-06-02 12:17:16

标签: python-3.x scrapy

我正在尝试开始抓取并将网站抓取到磁盘,但无法按照我的意愿使回调功能正常工作。

以下代码将访问start_url并找到网站上的所有“a”标记。对于其中的每一个,它将进行回调,即将文本响应保存到磁盘并使用crawerItem存储有关页面的一些元数据。

我希望有人可以帮我弄清楚如何通过

  1. 每个回调的唯一ID,因此在保存文件时可以将其用作文件名
  2. 传递原始页面的URL,以便可以通过Items
  3. 将其添加到元数据中
  4. 按照子页面上的链接进一步深入网站
  5. 以下是我的代码

    import scrapy
    from scrapy.spiders import Rule
    from scrapy.linkextractors import LinkExtractor
    from mycrawler.items import crawlerItem
    
    class CrawlSpider(scrapy.Spider):
        name = "librarycrawler"
        allowed_domains = ["example.com"]
        start_urls = [
            "http://www.example.com"
        ]
    
        rules = (
        Rule(LinkExtractor(),callback='scrape_page', follow=True)
    )
    
    def scrape_page(self,response):
        page_soup = BeautifulSoup(response.body,"html.parser")
        ScrapedPageTitle = page_soup.title.get_text()
        item = LibrarycrawlerItem()
        item['title'] =ScrapedPageTitle
        item['file_urls'] = response.url
    
        yield item
    

    在Settings.py

    ITEM_PIPELINES = [
        'librarycrawler.files.FilesPipeline',
    ]
    FILES_STORE = 'C:\Documents\Spider\crawler\ExtractedText'   
    

    在items.py

    import scrapy
    
    
    class LibrarycrawlerItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()
        Files = scrapy.Field()
    

1 个答案:

答案 0 :(得分:2)

我不是百分百肯定,但我认为你无法重命名scrapy图像文件,scrapy就是这样。

您想要做的事情看起来像CrawlSpider而非Spider的工作。

CrawlSpider本身跟随它在递归中的每个页面中找到的每个链接,您可以设置要废弃的页面的规则。以下是docs

如果您足够顽固地保留Spider,您可以在请求中使用元标记来传递项目并在其中保存链接。

for link in soup.find_all("a"):
        item=crawlerItem()
        item['url'] = response.urljoin(link.get('href'))
        request=scrapy.Request(url,callback=self.scrape_page)
        request.meta['item']=item
        yield request

要获取该项目,请在响应中查找:

def scrape_page(self, response):
    item=response.meta['item']

在此特定示例中,传递item['url']的项目已过时,因为您可以使用response.url

获取当前网址

此外,

在scrapy中使用美味汤是一个坏主意,因为它只会减慢你的速度,scrapy库真的很发达到你不需要任何其他东西来提取数据的程度!