VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline(2)

.close()
  •  
  • def process_item(self, item, spider):
  • self.db[self.collection_name].insert_one(dict(item))
  • return item
  • (4) 截取项目的截图

    从process_item()方法返回Deferred。它使用Splash渲染项目URL的屏幕截图。Pipeline向本地运行的Splash示例发出请求。下载请求并延迟回调激活后,它会将项目保存到文件并将文件名添加到项目中。

    
    	
    1. import scrapy
    2. import hashlib
    3. from urllib.parse import quote
    4.  
    5.  
    6. class ScreenshotPipeline(object):
    7. """Pipeline that uses Splash to render screenshot of
    8. every Scrapy item."""
    9.  
    10. SPLASH_URL = "http://localhost:8050/render.png?url={}"
    11.  
    12. def process_item(self, item, spider):
    13. encoded_item_url = quote(item["url"])
    14. screenshot_url = self.SPLASH_URL.format(encoded_item_url)
    15. request = scrapy.Request(screenshot_url)
    16. dfd = spider.crawler.engine.download(request, spider)
    17. dfd.addBoth(self.return_item, item)
    18. return dfd
    19.  
    20. def return_item(self, response, item):
    21. if response.status != 200:
    22. # Error happened, return item.
    23. return item
    24.  
    25. # Save screenshot to file, filename will be hash of url.
    26. url = item["url"]
    27. url_hash = hashlib.md5(url.encode("utf8")).hexdigest()
    28. filename = "{}.png".format(url_hash)
    29. with open(filename, "wb") as f:
    30. f.write(response.body)
    31.  
    32. # Store filename in item.
    33. item["screenshot_filename"] = filename
    34. return item

    (5) 重复过滤

    一个过滤器,用于查找重复项目,并删除已处理的项目。假设我们的项目具有唯一ID,但我们的spider会返回具有相同ID的多个项目:

    
    	
    1. from scrapy.exceptions import DropItem
    2.  
    3. class DuplicatesPipeline(object):
    4.  
    5. def __init__(self):
    6. self.ids_seen = set()
    7.  
    8. def process_item(self, item, spider):
    9. if item['id'] in self.ids_seen:
    10. raise DropItem("Duplicate item found: %s" % item)
    11. else:
    12. self.ids_seen.add(item['id'])
    13. return ite

    
    相关教程
    关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号