Python 刮-在同一个蜘蛛中刮取文本和图像
这是一个非常棒的地方。问题:我有一个html页面,其中既包含我想要刮取的信息,也包含我想要跟随的url,以获取我想要通过刮取图像管道下载和保存的图像的图像url 我的方法是: 1.像往常一样使用解析方法清除所有细节 2.在初始页面中找到url,创建一个请求,该请求具有第二个解析方法作为回调,我在其中构建image_url列表 因此,我有以下设置:Python 刮-在同一个蜘蛛中刮取文本和图像,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,这是一个非常棒的地方。问题:我有一个html页面,其中既包含我想要刮取的信息,也包含我想要跟随的url,以获取我想要通过刮取图像管道下载和保存的图像的图像url 我的方法是: 1.像往常一样使用解析方法清除所有细节 2.在初始页面中找到url,创建一个请求,该请求具有第二个解析方法作为回调,我在其中构建image_url列表 因此,我有以下设置: settings.py ... ITEM_PIPELINES = { 'crawlbot.pipelines.MybotPipeline':
settings.py
...
ITEM_PIPELINES = {
'crawlbot.pipelines.MybotPipeline': 300,
'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = '/url/to/images' #valid path to actual folder
...
这不起作用,尽管我对Scrapy和Python都知之甚少,但第二个解析方法应该返回一个image_URL列表。所以我有两个问题:1。有更好的方法来解决我的问题吗?也许整个问题都在于试图对一只蜘蛛做太多?2.如果方法正确,我做错了什么?请参见查找示例:您只需为
image\u URL
变量赋值。对于图像管道,您需要生成带有image\u URL
字段的项目。
pipelines.py
import pymongo
class MybotPipeline(object):
def __init__(self):
self.conn = pymongo.MongoClient('localhost', 27017)
db = self.conn['libraries']
self.collection = db['books']
def process_item(self, item, spider):
self.collection.insert(dict(item))
return item
items.py
import scrapy
class MybotItem(scrapy.Item):
url = scrapy.Field()
title = scrapy.Field()
images = scrapy.Field()
image_urls = scrapy.Field()
description = scrapy.Field()
crawler.py
import scrapy
from scrapy.spiders import CrawlSpider
class MySpider(CrawlSpider):
name = 'myspider'
allowed_domains = ['books.com']
def start_requests(self):
urls = [
'https://www.books.com/some/url'
]
custom_settings = {
'DEPTH_LIMIT': 1
}
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_item)
def parse_details(self, response):
for image in enumerate(response.xpath('//div[contains(@class, "jumbotron")]/div')):
image_urls = image.xpath('div[contains(@class, "jumbotron-image")]/img/@src').getall()
def parse_item(self, response):
for idx, list_item in enumerate(response.xpath('//div[contains(@class, "slider-wrapper")]')):
anchor = list_item.xpath('div[contains(@class, "slider-section")]/div/a')
slider_thumbnail = anchor.xpath('div[contains(@class, "slider-thumbnail")]')
description = slider_thumbnail.xpath('div[contains(@class, "description-box")]')
yield {
'url': anchor.xpath('@href').get(),
'description': description
}
details_page_urls = anchor.xpath('@href').getall()
for details_page in details_page_urls:
yield scrapy.Request(url=details_page, callback=self.parse_details)