scrapy的安装与使用
一 scrapy 的安装
下载地址:http://blog.****.net/liuweiyuxiang/article/details/68929999
1.简单安装方法:
终端输入命令 pip install scrapy 下载scrapy
在安装过程中会出现错误,这时我们就要安装whl格式的包
首先下载scrapy的whl包
下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
在网页中搜索scrapy找到
Scrapy‑1.3.3‑py2.py3‑none‑any.whl
2.安装whl格式包需要安装wheel库
pip install wheel 就可以安装了。
3.scrapy依赖twiste,同样使用whl格式的包进行安装
还是进入http://www.lfd.uci.edu/~gohlke/pythonlibs/,在网页中搜索twisted找到其对应的whl包并下载
Twisted‑17.1.0‑cp36‑cp36m‑win_amd64.whl
根据你的Python的版本选择合适的包,名称中间的cp36是python3.6的意思,amd64是python的位数
下载完成后使用cmd打开windows的命令行窗口,进入whl包所在的文件夹执行如下命令
在 命令行输入:pip install Twisted-17.1.0-cp36-cp36m-win_amd64.whl
Scrapy-1.3.3-py2.py3-none-any.whl包使用同样的方式安装,只是应该等到其所有依赖的包安装完成后才能进行安装,现在还不能安装
4、scrapy依赖lxml包,需要先安装lxml包,lxml包依赖libxml2,libxml2-devel,所以安装lxmllibxml2, libxml2-devel。幸运的是之前我之前已经安装过lxml
5、所有准备工作做完,中医可以安装scrapy包了,进入Scrapy-1.3.3-py2.py3-none-any.whl所在的目录
pip install Scrapy-1.3.3-py2.py3-none-any.whl
6.安装成功之后需要测试一下是否安装成功了。
命令行输入scrapy -h
这就是安装成功了
二 scrapy的使用
1.新建项目 scrapy startproject
在爬去之前必须新建一个scrapy项目,进入自定义的项目目录中,运行以下列命令:
scrapy startproject xiaohua_Spider | |
---|---|
xiaohua_Spider为新建的项目名,在根目录下打开文件,就会生成以下文件
这个是爬取校花图片的一个项目
2.pycharm中打开文件,会自动生成一些脚本
在items中引入代码
在spider下面新建一个xiaohua.py文件,会默认生成以下代码
import scrapy
class XiaohuaSpider(scrapy.Spider):
name = 'xiaohua'
allowed_domains = ['xiaohuar.com']
start_urls = ['http://www.xiaohuar.com/hua']
def parse(self, response):
pass
2.下面就是要爬取校花图片了
在 setting中修改一些数据。
把 True 改为 False
这里也需要修改
修改完后,在pipelines.py写入以下代码
import os
import requests
class XiaohuaSpiderPipeline(object):
def process_item(self, item, spider):
# 一个大型项目中可能会有多个spider和多个pipeline,判断一下确保item进入对应的pipeline中。
if spider.name == 'xiaohua':
print(item['folder_name'],item['img_name'],item['img_url'])
# 创建文件夹
base_dir = os.path.join(os.path.dirname(__file__) + 'IMG') # 项目根目录 D://xiaohua.spider/IMG
img_dir = os.path.join(base_dir,item['folder_name']) # D://xiaohua.spider/IMG/xxx校花
if not os.path.exists(img_dir):
os.makedirs(img_dir)
img_path = os.path.join(img_dir,item['img_name'])
# TODO 先用同步请求方式。scrapy自带异步方式作为作业。
# 请求和保存图片
img_url = item['img_url']
resp = requests.get(img_url)
if resp.status_code == 200:
img_bytes = resp.content
else:
print('{}下载失败'.format(img_url))
# 保存图片
with open(img_path, mode='wb') as f:
f.write(img_bytes)
print('{}保存成功'.format(img_path))
return item
写代码的同时,需要登录http://www.xiaohuar.com/hua校花网 获取xpath 以及登录百度首页的’User-Agent’获取。
下面是xiaohua.py里的代码,xpath , 'User-Agent’ 添加到代码当中。
# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from scrapy.http import Request
from xiaohua_spider.items import XiaohuaSpiderItem
class XiaohuaSpider(scrapy.Spider):
name = 'xiaohua'
allowed_domains = ['xiaohuar.com']
start_urls = ['http://www.xiaohuar.com/hua']
# 自定义头部 。可以在下面代码中载入设置或写在setting.py中
custom_settings = {
'DEFAULT_REQUEST_HEADERS':{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.9',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Safari/537.36',
}
}
# 存放待爬取的url,scrapy会自动去重和重试失败链接,我们只需要考虑住url集合中添加未爬取的url。
url_set = set()
def parse(self, response):
"""请求首页图集列表之后得到列表页,解析获得图集详情页的地址。"""
# 首先重写parse,否则父类会报NOtImplement异常
# response.xpath()。如果安装过lxml,scrapy默认用lxml.etree.etree.HTML(resp.content)
a_list = Selector(response).xpath('//div[@class="img"]/a')
for a in a_list:
detail_url= a.xpath('.//@href').extract_first()
if detail_url in self.url_set:
# 已爬取过
pass
else:
# 添加到待爬取连接池
self.url_set.add(detail_url)
# 发现 画廊页url
gallery_url =detail_url.replace('/p','/s')
# yield相当于同步函数里的返回值,callback相当于方法嵌套调用,只不过这两个关键字表现异步处理过程,yield生成请求对象(还没有发送请求)到队列中,框架从队列中取一个请求对象去请求,得到响应后再交给回调函数处理。
yield Request(url=gallery_url,callback=self.img_parse)
def img_parse(self,response):
"""请求画廊页后的html结果,生成item"""
src_list = Selector(response).xpath('//div[@class ="inner"]/a/img/@src').extract() # [http]
folder_name = Selector(response).xpath('//h1/text()').extract_first()
for src in src_list:
print('图片资源',src) # self.log('图片资源',scr)
img_url = src # 由于网站开发技术历史原因,有路由形式访问的 '/d/file/20180116/smalleef8a4887c7b40d646061a4211ccd7e81516071519.jpg'} 或
# 也有 http:///d/file/20180116/small69df9717ed58b035281c92a1f608b58d1516071519.jpg?
if img_url.startswith('https'):
pass
else:
# 路由形式的,协议http,没有解析xiaohuar.com
img_url = 'http://www.xiaohuar.com' + img_url
img_name = src.split('/')[-1]
# test
# item = XiaohuaSpiderItem(folder_name=folder_name,img_name = img_name,img_url=img_url)
item = XiaohuaSpiderItem()
item['folder_name'] = folder_name
item['img_name'] = img_name
item['img_url'] = img_url
yield item
这是爬取了一页的内容
另外还需在xiaohua_spider建一个main.py文件
在main.py写入代码 作为入口
# 程序入口
from scrapy import cmdline
cmdline.execute(['scrapy','crawl','xiaohua'])
这些完成之后 新建一个文件夹,来存储爬取的图片
运行main.py,就开始爬取图片了,
结束之后,打开存储图片的文件夹,就能看到图片了