技术标签: Python编程由简到繁
这次我们利用scrapy来爬取一个壁纸图片网站的壁纸图片,并且把它下载下来。地址链接为:http://pic.netbian.com/,这里我们爬取美食分类的图片。
1.首先我们先要去建立一个scrapy框架,定义爬虫类等等。
2.在image.py中写代码。
# -*- coding: utf-8 -*-
import scrapy
from ..items import ImagenetItem
class ImageSpider(scrapy.Spider):
name = 'image'
allowed_domains = ['pic.netbian.com']
start_urls = ['http://pic.netbian.com/4kmeishi/']
def parse(self, response):
# 根据响应来找到指定的内容,现在找到的是img的src属性
img_list=response.xpath('//ul[@class="clearfix"]/li/a/img/@src')
print(img_list)
for img in img_list:
item=ImagenetItem()
# 拼接url,得到完整的网址
src='http://pic.netbian.com'+img.extract()
# print(src)
# 将得到的下载地址放入数据模型中
## 下载地址要包在列表当中
item['src']=[src]
# 将数据模型传输给管道
yield item
#获取下一页的链接
next_url=response.xpath('//div[@class="page"]/a[text()="下一页"]/@href').extract()
print('-------------------------------------------------------'
if len(next_url)!=0:
# print(next_url)
url='http://pic.netbian.com'+next_url[0]
# 将url传给scrapy.Request 得到的结果继续用self.parse进行处理
yield scrapy.Request(url=url,callback=self.parse)
这个就是首先获取图片的链接,拼接成完整的网址。然后把图片的下载链接传到管道里面。然后获取下一页的链接,把这个链接返回到最开始的地方使用,获取下一页的图片所有链接。
3.items.py中书写代码如下。
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class ImagenetItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
src=scrapy.Field()
pass
4.settings.py中做以下操作。
# ROBOTSTXT_OBEY = True或者等于False
TEM_PIPELINES = {
# 'imageNet.pipelines.ImagenetPipeline': 300,
# scrapy中专门负责图片下载的管道
'scrapy.pipelines.images.ImagesPipeline':1
}
# 图片的存储路径
IMAGES_STORE='imageDownLoad'
# 图片的下载地址,这是根据item中的字段来设置哪一个内容需要被下载
IMAGES_URLS_FIELD='src'
在终端中输入命令:scrapy crawl image,按下回车,会得到以下的内容
这个就是我们爬取下载下来的图片。这样便算是完成了这个简单的项目。
再给大家说一下scrapy整个的运作流程,我从网上找到了一个很形象的叙说
scrapy.cfg :项目的配置文件
imageNet :项目的Python模块,将会从这里引用代码
items.py :项目的目标文件
pipelines.py :项目的管道文件
settings.py :项目的设置文件
spiders/:存储爬虫代码目录
代码写好,程序开始运行...
引擎
:Hi!Spider
, 你要处理哪一个网站?
Spider
:老大要我处理xxxx.com。
引擎
:你把第一个需要处理的URL给我吧。
Spider
:给你,第一个URL是xxxxxxx.com。
引擎
:调度器
,我这有request请求你帮我排序入队一下。
调度器
:好的,正在处理你等一下。
引擎
:调度器
,把你处理好的request请求给我。
调度器
:给你,这是我处理好的request
引擎
:下载器,你按照老大的下载中间件
的设置帮我下载一下这个request请求
下载器
:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎
告诉调度器
,这个request下载失败了,你记录一下,我们待会儿再下载)
引擎
:Spider
,这是下载好的东西,并且已经按照老大的下载中间件
处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()
这个函数处理的)
Spider
:(处理完毕数据之后对于需要跟进的URL),Hi!引擎
,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
引擎
:管道
我这儿有个item你帮我处理一下!调度器
!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
管道:调度器
:好的,现在就做!
我们在书写代码的时候,可能会根据个人的书写喜好原因等等,顺序会不太一样,本人的编写代码顺序如下:
1.我们先新建立好一个scrapy框架和爬虫类等等。
2.编写代码,获取我们所需要的内容,这里我们是获取到了图片的链接。然后对链接进行处理,拼接等等。 src='http://pic.netbian.com'+img.extract()
3.获取下一页的链接,拼凑成完整的网址,并且利用 yield scrapy.Request(url=url,callback=self.parse)构成一个循环。
4.进入到items.py中,编写我们获取的内容变量。src=scrapy.Field()
5.回到image.py中,引入模块:from ..items import ImagenetItem,编写上:
item=ImagenetItem()
item['src']=[src]
yield item
6.进入到settings.py中,编写程序:
# ROBOTSTXT_OBEY = True或者等于False
TEM_PIPELINES = {
# 'imageNet.pipelines.ImagenetPipeline': 300,
# scrapy中专门负责图片下载的管道
'scrapy.pipelines.images.ImagesPipeline':1
}
# 图片的存储路径
IMAGES_STORE='imageDownLoad'
# 图片的下载地址,这是根据item中的字段来设置哪一个内容需要被下载
IMAGES_URLS_FIELD='src'
这里imageDownLoad是一个路径,你也可以在桌面或者其他文件夹下新建一个文件夹。把imageDownLoad替换成新建文件夹的路径。
IMAGES_URLS_FIELD='src'中src就是我们想要下载图片的链接。
7.终端中,输入命令,scrapy crawl image,静静的等它下完就好了。
好了,本次的分享就先告一段落,本人会不定时的继续和大家分享有关python的知识的。
在我们能够迁移到IPv6之前,IPv4地址肯定就耗光了,因此我们必须渡过一段时间,不仅有IPv4与IPv6共存,而且是IPv4地址共享的时代。 IPv4地址共享技术大致有两类。一种是运营商运营NAT,给用户分配的是RFC1918的地址;另外一种是为用户分配公开IPv4地址,通过划分不同的port区间共享。前一种技术的典型代表是Carrier Grade NAT (CGN), 也
我不是领导,如何让别人听我的话
spark命令总结:yarn application -list : 列出所有正在执行的任务。spark-submit 提交任务任务。以及各参数的含义。spark-submit \–master yarn \–jars required_jars/spark-streaming-kafka-0-8-assembly_2.11-2.4.3.jar \–deploy-mode cluster \–num-executors 1 \–executor-memory 1G \–driver-m
问题描述:有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。输入
北京54,西安80,wgs84坐标都是是大地坐标,也就是我们通常所说的经纬度坐标,但是它们基于的椭球体不同,我国当前的基本比例尺地形图都是基于北京54和西安80的,而GPS接受的定位数据是基于WGS84的。UTM投影坐标UTM是一种投影坐标,是将球面经纬度坐标经过投影算法转换成的平面坐标,即通常所说的XY坐标.WGS-84坐标系WGS-84坐标系(World Geodetic Sy...
#!/usr/bin/env python# -*- coding:utf-8 -*-import urllib.requestimport urllib.parseimport jsonimport ssl# 通过抓包工具,获取接口post_url = 'https://fanyi.baidu.com/v2transapi'headers = { 'User-Age...
本周阅读了《我是一只IT小小鸟》的第二部分,即居振梁的自述,这一部分与上一部分不同,我与这位前辈的共鸣不强,对其观点的反对之处却有一些。 先说我认同的观点吧。 首先,关于“课内”与“课外”,确实,现在的某些必修课程对于IT工程师或是科学家来说,可能一辈子都不会用到(比如原子物理),但是这些必修课程是计入个人成绩的,它们也许不会影响你的软工水平,但是会影响...
最近在学习基于数据和概率模型的推理方法,包括蒙特卡洛采样、贝叶斯方法、狄利克雷过程等等,希望能够有时间总结一下,写成博客,目的有两个:一是希望自己能够把所学的内容总结一下,二是讲给别人听也能够让自己加深对所学的理解。内容会不定期更新。...
继续昨天对于 ORA-00600问题的排查和分析(上)http://blog.itpub.net/23718752/viewspace-1696076/我们发现了一大堆的ORA错误。我们首先排除了deadlock造成的o...
虚拟机装好RedHat后,准备使用filezilla连接,输入IP地址,root用户,密码,快速连接,报错:530 Permission denied。故障排除:1.首先检查系统是否开启了vsftp服务,如果没有开启,先开启该服务。2.查看配置vsftpd的配置,配置文件中限定了vsftpd用户连接控制配置。vsftpd.ftpusers:位于/etc/vsftpd目...
1.mysql容器使用命令1.1使用命令行进入docker容器内部:sudo docker exec -it containerID /bin/bash 1.2使用mysql用户进行登录查看:mysql -uedc_mng -p根据提示输入密码即可进入,进入之后使用方式与非镜像方式一致2.容器中安装vim2.1 使用 apt-get install vim 命令进行安装操作现上图错误,需要先使用2...
上周迅雷面试的时候,面试官小姐姐问到了一道这样的网红题,当时我对parseInt的第二个传参还不太清楚,所以也没法答上来,事后觉得这个考题挺有意思的,所以记录一下a = [‘1’,‘2’,‘3’].map(parseInt)console.log(a) // [1,NaN,NaN]map函数map的参数是一个函数,两个分别是当前元素值和当前index值。parseInt函数parseInt函数的用法及返回结果 parseInt("2");//2----------1 parseI