Scrapy命令行格式
> scrapy <command>[options][args]
命令行更好自动化,适合脚本控制
Scrapy的具体命令
[options]
[args]
Scrapy的常用命令:
startproject
scrapy startproject [dir]
创建一个新工程
genspider
scrapy genspider [options]
创建一个爬虫
settings
scrapy settings [options]
获得爬虫配置信息
crawl
scrapy crawl
运行一个爬虫
list
scrapy list
列出工程中的所有爬虫
shell
scrapy shell [url]
启动一个shell,运行URL调试命令行
Scrapy爬虫产生步骤
1、在指定目录下使用命令行创建一个Scrapy爬虫工程
scrapy startproject test1
#创建一个新工程,命名为test1
外层目录:test1/
部署Scrapy爬虫的配置文件:scrapy.cfg
Scrapy框架的用户自定义Python代码:test1/
初始化脚本:__ init __.py
Items类的代码模板(继承类):items.py
Middlewares对应的代码模板(继承类):middlewares.py
Pipelines代码模块(继承类):pipelines.py
Scrapy爬虫的配置文件:settings.py
Spiders代码模板目录(继承类):spiders/
初始文件,无需修改:__ init __ .py
缓存目录,无须修改,一开始没有:__ pycache __/
2、在工程中产生一个Scrapy爬虫
cd test1
#进入test1工程中,注意:Cannot create a spider with the same name as your project
scrapy genspider test <domain>.io
#生成一个命名为test的spider,且只能爬取域名为.io的网站
比如:scrapy genspider test home.firefoxchina.io
在Spiders代码模板目录(继承类):spiders/目录下产生了一个test.py文件
test.py中的内容:
import scrapy
class TestSpider(scrapy.Spider):
#面向对象的方式编写了一个叫TestSpider的类,继承于scrapy.Spider这个类的子类
name = 'test' #当前爬虫的名字
allowed_domains = ['home.firefoxchina.io'] #用户提交给命令行的域名,爬虫爬取网站时只能爬取这个域名以下的相关链接
start_urls = ['http://home.firefoxchina.io/'] #以列表形式包含的一个或多个url就是Scrapy框架所要爬取的初始页面
def parse(self, response): #解析空页面的空的方法,parse用于处理响应并解析内容形成字典,发现其中隐含的新的URL爬取请求
#self 面向对象类所属关系的标记;response 相当于从网络中返回内容所存储或对于的对象
pass
3、配置产生的spider爬虫
修改test.py文件
简化版:
import scrapy
class TestSpider(scrapy.Spider):
name = 'test'
#allowed_domains = ['home.firefoxchina.io']
#start_urls = ['http://home.firefoxchina.io/']
start_urls = ['http://python123.io/ws/demo.html']
def parse(self, response): #对返回的页面进行解析并操作
fname=response.url.split('/')[-1]
with open(fname,'wb')as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
完整版:
import scrapy
class TestSpider(scrapy.Spider):
name = 'test'
def start_requests(self) #将一个命令拓展成一个方法
urls=
[
'http://python123.io/ws/demo.html'
]
for url in urls:
yield scrapy.Request(url=url,callback=self.parse)
#使用生成器,每次只提交列表中的一个url请求
def parse(self, response):
fname=response.url.split('/')[-1]
with open(fname,'wb')as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
4、运行爬虫
scrapy crawl test
yield关键字
生成器:不断产生值的函数
包含yield语句的函数是一个生成器
生成器每次产生一个值(yield语句)时函数会被冻结,被唤醒后从被冻结位置继续执行,再产生一个值
生成器写法:
def gen(n):
for i in range(n)
yield i**2
#能够产生小于n的所有整数的平方值
#在调用该函数的时候,会首先产生当i=0时的值的平方值,然后遍历循环,每次返回一个值
for i in gen(5)
print (i," ",end="")
普通写法:
def square(n):
ls=[i**2 for i in range(n)]
return ls
#计算出所有可能的值并以列表的形式返回所有的值
for i in square(5)
print (i," ",end="")
生成器的优势:
更节省存储空间
相应更迅速
使用更灵活
Scrapy爬虫的使用步骤
1、创建一个工程和Spider模板
2、编写Spider
3、编写Item Pipeline
4、优化配置策略
Scrapy爬虫的数据类型
Request类
代表向网络上提交请求的内容
class scrapy.http.Request()
Request对象表示一个HTTP请求
由Spider生成,由Downloader执行
属性或方法:
.url
Request对应的请求URL地址
.method
对应的请求方法,‘GET’、'POST’等
.headers
字典类型风格的请求头,可以对访问网站请求的http的头部进行自定义
.body
请求内容主题,字符串类型
.meta
用户添加的拓展信息,在Scrapy内部模块间传递信息使用
.copy()
复刻该请求
Response类
表示从网络中爬取内容的封装类和item类
class scrapy.http.Response()
Response对象表示一个HTTP响应
由Downloader生成,由Spider处理
属性或方法:
.url
Response对应的URL地址
.status
HTTP状态码,默认是200(返回信息成功接收)
.headers
对应的头部信息
.body
对应的内容信息,字符串类型
.flags
一组标记
.request
产生Response类型对应的Request对象
.copy()
复制该响应
Item类
由spider产生的信息封装的类
class scrapy.http.Item()
Item对象表示一个从HTML页面中提取的信息内容
由Spider生成,由Item Pipeline处理
Item类似字典类型,可以按照字典类型操作
spider用来解析html页面的方法:
Beautiful Soup
lxml
re
XPath Selector
CSS Selector
CSS Selector的基本使用
<HTML>.css('a::attr(href)').extract()
通过输入标签名称’a’和标签属性’href’来获得对应的标签信息,不用再import requests库了