【问题标题】:Trouble downloading images with Scrapy - works sometimes使用 Scrapy 下载图像时遇到问题 - 有时有效
【发布时间】:2015-06-12 12:28:42
【问题描述】:

到目前为止,我的蜘蛛代码运行良好,但现在当我尝试运行一批这些蜘蛛时,一切正常,除了一些蜘蛛,scrapy 下载图像,其余的什么都没有。除了 start_urls 之外,所有的蜘蛛都是一样的。任何帮助表示赞赏!

这是我的 pipelines.py

from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy.http import Request

class DmozPipeline(object):
    def process_item(self, item, spider):
    return item

class MyImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
       for image_url in item['image_urls']:
        yield Request(image_url)

        for nlabel in item['nlabel']:
        yield Request(nlabel)

        print item['image_urls']


def item_completed(self, results, item, info):
    image_paths = [x['path'] for ok, x in results if ok]
    if not image_paths:
        raise DropItem("Item contains no images")
    item['image_paths'] = image_paths
    return item

settings.py:

BOT_NAME = 'dmoz2'
BOT_VERSION = '1.0'

SPIDER_MODULES = ['dmoz2.spiders']
NEWSPIDER_MODULE = 'dmoz2.spiders'
DEFAULT_ITEM_CLASS = 'dmoz2.items.DmozItem'
ITEM_PIPELINES = ['dmoz2.pipelines.MyImagesPipeline']
IMAGES_STORE = '/ps/dmoz2/images'
IMAGES_THUMBS = {
#letting height be variable
#'small': ('', 120),
'small': (120, ''),
#'big': ('', 240),
'big': (300, ''),
}


USER_AGENT = '%s/%s' % (BOT_NAME, BOT_VERSION)

items.py:

from scrapy.item import Item, Field
from scrapy.utils.python import unicode_to_str

def u_to_str(text):
   unicode_to_str(text,'latin-1','ignore')


class DmozItem(Item):
   category_ids = Field()
   ....
   image_urls = Field()
   image_paths = Field()

   pass

myspider.py:

from scrapy.spider import BaseSpider
from scrapy.spider import Spider
from scrapy.selector import HtmlXPathSelector
from scrapy import Selector
from scrapy.utils.url import urljoin_rfc
from scrapy.utils.response import get_base_url
from dmoz2.items import DmozItem

class DmozSpider(Spider):
   name = "fritos_jun2015"
   allowed_domains = ["walmart.com"]
   start_urls = [

    "http://www.walmart.com/ip/Fritos-Bar-B-Q-Flavored-Corn-Chips-9.75- oz/36915853",
    "http://www.walmart.com/ip/Fritos-Corn-Chips-1-oz-6-count/10900088",

]


def parse(self, response):
    hxs = Selector(response)
    sites = hxs.xpath('/html/body/div[1]/section/section[4]/div[2]')
    items = []
    for site in sites:
        item = DmozItem()
        item['category_ids'] = ''
        .....
        item['image_urls'] = site.xpath('div[1]/div[3]/div[1]/div/div/div[2]/div/div/div[1]/div/div/img[2]/@src').extract()
        items.append(item)
    return items

真的很想知道为什么同一只蜘蛛有时会抓取图像,而有时却不会。除了来自同一个 allowed_domain 的 start_urls 之外,所有的蜘蛛都是相同的。而且图片都是绝对路径,而且路径是正确的。

提前致谢。 -TM

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    当屏幕抓取时,一个常见的问题是服务器会因为您过于频繁地尝试访问它而切断连接(以防止屏幕抓取器无意中删除他们的网站,并防止由于有人 ping 他们的网站每毫秒等)。

    尝试添加一个

    sleep()
    

    对沃尔玛页面的每个请求之间的方法。这样你就不会被阻止访问服务器。

    【讨论】:

    • 所以我进一步研究了scrapy,它有一个名为DOWNLOAD_DELAY的设置,这里是它的文档doc.scrapy.org/en/latest/topics/settings.html#download-delay这也可能无法100%工作,所以尝试将下载放在尝试 catch 块,如果你得到图像继续,如果你没有,尝试再次下载它
    • 如果网站阻止了我的蜘蛛,蜘蛛是否能够获取文本内容?我得到的所有文本内容都很好,只有图像不会下载。
    • 你不会的。您应该尝试查看是否可以自己从空白页面手动下载图像(获取已加载但图像未下载的页面的 html 并查看是否可以将 src 链接复制到浏览器并查看图像)
    • 是的,我可以手动下载图像,然后从源 html 中复制链接以在浏览器中打开它。而且由于蜘蛛可以正常获取所有文本内容,因此还有其他事情发生。我正在尝试除沃尔玛之外的其他几个网站,但图片没有运气。
    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多