爬取图片过程遇到的ValueError: Missing scheme in request url: h 报错与解决方法

一 、scrapy整体框架

1.1 scrapy框架图

  

1.2 scrapy框架各结构解析

  item:保存抓取的内容

  spider:定义抓取内容的规则,也是我们主要编辑的文件

  pipelines:管道作用,用来定义如何过滤、存储等功能(比如导出到csv或者mysql等功能)

  settings:配置例如ITEM_PIPELINES 、图片存储位置等等功能

  middlewares:下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response

  

1.3 数据流过程

  从start_urls 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider 分析出来的结果有两种:一种是需要进一步抓取的链接,例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到 Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。  

二、 爬取图片过程

2.1 整体介绍

2.1.1 环境

Anocondas+python3.6

2.1.2 创建工程

1、创建hupu这个工程

E:\pgtool>scrapy startproject  hupu

2、创建相应的spiders

E:\pgtool>cd hupu##必须是进入到创建的项目中去建spiders

E:\pgtool\hupu>scrapy  genspider hp  hupu.com  ##hp=>生成hp.py ,爬虫名称为hp.py,允许访问的域名为hupu.com

通过爬取http://photo.hupu.com/nba/p35923-1.html网页中一个系列的图片

2.2 配置各组件

2.2.1 item.py

import scrapy

class HupuItem(scrapy.Item):
    # define the fields for your item here like:
    hupu_pic = scrapy.Field()
#    images = scrapy.Field()
    image_paths = scrapy.Field()

2.2.2 settings.py

BOT_NAME = ‘hupu‘

SPIDER_MODULES = [‘hupu.spiders‘]
NEWSPIDER_MODULE = ‘hupu.spiders‘
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
    ‘hupu.pipelines.HupuImgDownloadPipeline‘: 300,
}
IMAGES_URLS_FIELD = "hupu_pic"  # 对应item里面设定的字段,取到图片的url
#IMAGES_RESULT_FIELD = "image_path"
IMAGES_STORE = ‘E:/hupu‘

2.2.3 hp.py

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 from scrapy import Request
 4 from urllib.parse import urljoin
 5 from hupu.items import HupuItem
 6 class HpSpider(scrapy.Spider):
 7     name = ‘hp‘
 8     allowed_domains = [‘hupu.com‘]
 9     start_urls = [‘http://photo.hupu.com/nba/p35923-1.html‘]
10
11     def parse(self, response):
12         item=HupuItem()
13         url=response.xpath(‘//div[@id="picccc"]/img[@id="bigpicpic"]/@src‘).extract()
14
15         reurl="http:"+url[0]
16         print (‘links is :--‘,‘\n‘,reurl)
17         list1=[]
18         list1.append(reurl)
19         item[‘hupu_pic‘]=list1
20         yield item
21         ifnext=response.xpath(‘//span[@class="nomp"]/a[2]/text()‘).extract()[0]
22         if "下一张" in ifnext:
23             next_url=response.xpath(‘//span[@class="nomp"]/a[2]/@href‘).extract()[0]
24             yield Request((‘http://photo.hupu.com/nba/‘+next_url),callback=self.parse)

2.2.4 pipelines.py

 1 from scrapy.pipelines.images import ImagesPipeline
 2 from scrapy import Request
 3 class HupuPipeline(object):
 4     def process_item(self, item, spider):
 5         return item
 6 class HupuImgDownloadPipeline(ImagesPipeline):
 7
 8     def get_media_requests(self, item, info):
 9         for image_url in item[‘hupu_pic‘]:
10             yield Request(image_url)

三、 爬虫执行与结果

3.1 执行过程

  进入到工程路径下 scrapy crawl hp

  (base) E:\pgtool\Files\hupu>scrapy crawl hp

3.2 获得结果

四、遇到的问题与分析解决

4.1 问题出现

     最开始遇到ValueError: Missing scheme in request url: h 这种报错,如下图

  

4.2  问题解析

  如果单纯获取文本,那么只需start_urls是一个list;而如果获取图片,则必须start_urls与item中存储图片路径字段这两者必须都是 list。

4.3 解决方案

    未修改前的spiders:

  

  修改后spiders

  

五、总结

  scrapy框架简单容易理解,而且支持异步多线程,是一个比较上手的爬虫框架。本次爬虫犯了一个低级错误,在于直接将图片链接转换为list而不经意间将链接拆分为一个一个的元素,如下示例:

  str1=‘baidu.com‘

  list1=list(str1)

  list1的结果实际为[‘b‘,‘a‘,‘i‘,‘d‘,‘u‘,‘.‘,‘c‘,‘o‘,‘m‘],这也就是为什么一直报错Missing scheme in request url: h(翻译为:请求URL中的丢失整体链接:在h开始的位置)所以需要我们将整个链接放在只有一个元素的list中,使用修改后list.append()将一个链接完整的放置在list[0]中。

有问题的小伙伴们可以留言讨论交流,转载请注明出处,谢谢。

原文地址:https://www.cnblogs.com/mrtop/p/10176926.html

时间: 2024-10-05 23:25:13

爬取图片过程遇到的ValueError: Missing scheme in request url: h 报错与解决方法的相关文章

zabbix   监控平台搭建过程中的报错与解决方法总结

1.php    option  post_max_size 2.php    option  max_execution_time 3.php    option  max_input_time 4.php    time   zone 5.php     bcmath 6.php     mbstring 解决1-3的报错修改php文件 vim  /etc/php.ini 修改相应参数为Required值 解决4报错:修改date.timezone=/Asia/Shanghai  注意去掉该

20170514002Oracle 11g R2安装过程中遇到的报错及解决办法

Oracle 11g R2安装过程中遇到的报错及解决办法 1.提示Check if the DISPLAYvariable is set.    Failed<<<< 解决方案: #xhost +  //切换到root用户输入 #su – Oracle  //切换到oracle用户 $./runInstaller  //执行安装程序 xhost 是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时, 做为应用程序来说,hostA

Django: __init__() missing 1 required positional argument: &#39;on_delete&#39;报错解决方案

最近在使用Python的Django框架开发web站点,通过models.py文件建表后,执行数据库迁移(命令行:mange.py makemigrations)时报错,下面是查看官方文档后找到的解决方案. 官方文档:Model field reference 报错内容: 1 class Guest(models.Model): 2 File "C:\Users\dell\guest\sign\models.py", line 18, in Guest 3 event = models

Jmeter录制脚本过程及报错的解决

两个报错:Could not create script recorder报错和您的连接不是私密连接报错 1.录制过程 * 打开jmeter * 点击Templated,选择Recoding模版 * 点击WorkBench节点下-->添加-->非测试元件-->HTTP代理服务器 http代理服务器是这个样子的 2.点击启动就开始报错了 报错信息: Could not create script recorder -see log for detail:>>非法选项: -ext

ffmpeg Operation not permitted 报错的解决过程记录

问题重现 由于视频的录制过程出现了一些小问题,需要重新将视频文件切割和合并,找了几个视频编辑软件来做这个事情,最终的结果都不是特别满意,当时已经挺晚的了,本来打算上床睡觉第二天再去想辙,从椅子上起身的时候忽然想到了 ffmpeg 这个工具,挺久之前在工作中用它做了一个视频切割相关的功能,于是赶紧把它安装和配置好,视频切割的时候倒还顺利,在进行视频合并的时候出现了题目中的这个问题: Operation not permitted 我把当时的相关文件都放在这里,如下图所示: 我需要把图中 27-en

tomcat中安装JDK报错详细解决过程

在安装tomcat时解压安装JDK时出现如下报错:[[email protected] src]# wget 'http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-i586.tar.gz'--2016-01-18 04:21:56--  http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-i586.tar.gz正在解析主机 dow

release系统打包报错的解决过程

报错信息: INFO: Illegal access: this web application instance has been stopped already.  Could not load org.apache.commons.pool.impl.CursorableLinkedList$Cursor.  The eventual following stack trace is caused by an error thrown for debugging purposes as w

自动化脚本过程中出现This element neither has attached source nor attached Javadoc...的解决方法

This element neither has attached source nor attached Javadoc and hence no Javadoc could be found Eclipse有直接查看java文档和类库源码的功能,不过得手工添加才行,下面对如何在Eclipse中添加java文档和类库源码进行总结. 1. Window->Pereferences...打开参数选择对话框,展开Java节点,单击“Installed JREs",此时右边窗口会显示已经加载的j

蘑菇街TeamTalk编译连接过程中遇到的问题及解决方法(iOS客户端)

今天浏览博文的时候,“蘑菇街开源的即时通讯框架,包括iOS.Android.Mac.Windows客户端和后台 Github源码下载地址:https://github.com/mogujie/TeamTalk ”这段话吸引了我,我就git clone https://github.com/mogujie/TeamTalk.git  到本地.一运行,没想到出现了很多问题.没办法,只能一个一个的解决,为了总结一下解决的思路以及过程,所以我写下了这片文章. 下面就详细介绍一下: 1. error: T