一 、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

 # -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from urllib.parse import urljoin
from hupu.items import HupuItem
class HpSpider(scrapy.Spider):
name = 'hp'
allowed_domains = ['hupu.com']
start_urls = ['http://photo.hupu.com/nba/p35923-1.html'] def parse(self, response):
item=HupuItem()
url=response.xpath('//div[@id="picccc"]/img[@id="bigpicpic"]/@src').extract() reurl="http:"+url[0]
print ('links is :--','\n',reurl)
list1=[]
list1.append(reurl)
item['hupu_pic']=list1
yield item
ifnext=response.xpath('//span[@class="nomp"]/a[2]/text()').extract()[0]
if "下一张" in ifnext:
next_url=response.xpath('//span[@class="nomp"]/a[2]/@href').extract()[0]
yield Request(('http://photo.hupu.com/nba/'+next_url),callback=self.parse)

2.2.4 pipelines.py

 from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class HupuPipeline(object):
def process_item(self, item, spider):
return item
class HupuImgDownloadPipeline(ImagesPipeline): def get_media_requests(self, item, info):
for image_url in item['hupu_pic']:
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]中。

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

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

  1. 运行scrapy保存图片,报错ValueError: Missing scheme in request url: h

    查阅相关资料,了解到使用ImagesPipeline传入的url地址必须是一个list,而我写的是一个字符串,所以报错,所以需要修改一下传入的url格式就行了 def parse_detail(sel ...

  2. 持续更新scrapy的错误,ValueError: Missing scheme in request url:

    只需要将 for href in response.xpath('XX').extract(): yield Request(hrefs) 修改为下面,就可以显示出来 for href in resp ...

  3. scrapy 错误:Missing scheme in request url: %s' % self._url

    先说报错原因:使用了和start_urls同名的参数 我通过scral crawl projename -a start_urls=http:example.com来传start_urls,然后想在项 ...

  4. kubernetes安装过程报错及解决方法

    1.your configuration file uses an old API spec: "kubeadm.k8s.io/v1alpha2". 执行kubeadm init ...

  5. adb+tcpdump手机抓包过程出现的报错及解决方法

    tcpdump下载:https://www.androidtcpdump.com/android-tcpdump/downloads 1.夜神模拟器连接不上adb D:1手机木马取证\android- ...

  6. The address where a.out.debug has been loaded is missing以及No symbol "*" in current context原因与解决方法

    最近,在debug core的时候,发现p 变量的时候提示“No symbol "*" in current context”,我们的代码使用-g编译的,经查有可能是下列几个原因或 ...

  7. PHPmailer关于Extension missing: openssl报错的解决

    最近在写一个网页的时候,需要用到PHPmailer来发送邮件,按照官网上给出的demo写出一个例子,却报错Extension missing: openssl 最后发现需要修改php.ini中的配置: ...

  8. missing 1 required positional argument: 'on_delete'报错解决方案

    最近在使用Python的Django框架开发web站点,通过models.py文件建表后,执行数据库迁移(命令行:mange.py makemigrations)时报错,下面是查看官方文档后找到的解决 ...

  9. jupyter notebook中出现ValueError: signal only works in main thread 报错 即 长时间in[*] 解决办法

    我在jupyter notebook中新建了一个基于py3.6的kernel用来进行tensorflow学习 但是在jupyter notebook中建立该kernel时,右上角总是显示 服务正在启动 ...

随机推荐

  1. 【luogu P1801 黑匣子_NOI导刊2010提高(06)】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1801 替罪羊树吼啊! #include <cstdio> #include <cstrin ...

  2. papers-06-07

    A simple neural network module for relational reasoning Visual Interaction Networks 今天被这两篇文章的工作刷屏,说实 ...

  3. JDBC jar包

    密码qiij https://pan.baidu.com/share/init?surl=oBfMwQ6rd9t6VNjIluF1qw

  4. CALayer创建图层(转)

    一.添加一个图层  添加图层的步骤:  1.创建layer  2.设置layer的属性(设置了颜色,bounds才能显示出来)  3.将layer添加到界面上(控制器view的layer上) @int ...

  5. Hibernate知识点小结(二)

    一.持久化对象和标识符    1.持久化类        配置完关系后,操作的实体对应的类,成为持久化类 (Customer) 2.持久化类标识符(oid:object id)        3.持久 ...

  6. Ajax 跨域的几种解决方案

    作者:黄轩链接:http://www.zhihu.com/question/19618769/answer/38934786来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...

  7. luogu p2615神奇的幻方题解

    目录 题目部分 讲解部分 代码实现 题目部分 题目来源:洛谷p2615 题目描述 幻方是一种很神奇的 N*N矩阵:它由数字 1,2,3,⋯⋯,N×N 构成,且每行.每列及两条对角线上的数字之和都相同. ...

  8. Mysql升级过程的问题

    升级安装5.6版本mysql linux环境下的yum默认mysql版本是5.1的,由于项目需要保存表情等4个字节的数据,版本受限,需要升级到5.6版本支持utf8mb4格式的编码. 升级过程大概就是 ...

  9. 课时102.CSS精灵图(掌握)

    我们这节课来介绍一个和背景图片相关的东西,精灵图 1.设么是css精灵图? css精灵图是一种图像合成技术 2.css精灵图作用 可以减少请求的次数,以及可以降低服务器处理压力 3.如何使用css精灵 ...

  10. Leecode刷题之旅-C语言/python-70爬楼梯

    /* * @lc app=leetcode.cn id=70 lang=c * * [70] 爬楼梯 * * https://leetcode-cn.com/problems/climbing-sta ...