scrapy03

scrapy爬虫基本使用

目标: 将中大招生网爬取body存在html文件中

http://admission.sysu.edu.cn/

步骤一:

应用scrapy爬虫框架主要编写配置型代码

步骤1:建立一个Scrapy爬虫工程 选取一个目录(D:\pycodes\),然后执行如下命令:

scrapy startproject pythonSYSU

###生成的工程目录:

1
2
3
4
5
6
7
8
9
10
11
12
pythonSYSU/    外层目录
scrapy.cfg 部署Scrapy爬虫的配置文件
pythonSYSU/ Scrapy框架的用户自定义Python代码
__init__.py 初始化脚本
items.py Items代码模板(继承类)
middlewares.py Middlewares代码模板(继承类)
pipelines.py Pipelines代码模板(继承类)
settings.py Scrapy爬虫的配置文件
spiders/ Spiders代码模板目录(继承类) 内层目录结构 用户自定义的spider代码增加在此处
__init__.py 初始文件,无需修改
__pycache__/ 缓存目录,无需修改
__pycache__/ 缓存目录,无需修改

步骤二:

在工程中产生一个scrapy爬虫, 进入工程目录执行:
scrapy genspider SYSU admission.sysu.edu.cn

该命令作用:

(1)生成一个名称为SYSU的spider

(2)在spiders目录下增加代码文件SYSU.py

该命令仅用于生成SYSU.py,该文件也可以手工生成

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding: utf-8 -*-
import scrapy

class SYSUSpider(scrapy.Spider)
{
name = "SYSU"
allowed_domains = ["admission.sysu.edu.cn"]
start_urls = ['http://admission.sysu.edu.cn/']

def parse(self, response):
pass
# parse()用于处理响应,解析内容形成字典, 发现新的URL爬取请求
}

parse()用于处理响应,解析内容形成字典,发现新的URL爬取请求

步骤三:

配置产生的spider爬虫:

  1. 初始url地址
  2. 获取页面后的解析方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# -*- coding: utf-8 -*-
import scrapy

class SYSUSpider(scrapy.Spider)
{
name = "SYSU"
allowed_domains = ["admission.sysu.edu.cn"]
start_urls = ['http://admission.sysu.edu.cn/']

def parse(self, response):
fname = response.url.split('.')[-3] + '.html'
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
}

步骤四:

运行爬虫,获取网站:

scrapy crawl pythonSYSU

SYSU爬虫被执行,捕获页面存储在sysu.html

SYSU.py代码的完整版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# -*- coding: utf-8 -*-
import scrapy

class SYSUSpider(scrapy.Spider)
{
name = "SYSU"

def start_requests(self):
urls = [
'http://admission.sysu.edu.cn/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
fname = response.url.split('.')[-3] + '.html'
with open(fname, 'wb') as f:
f.write(response.body)
self.log('Saved file %s.' % fname)
}

yield 关键字:

yield->生成器

  • 包含yield语句的函数是一个生成器

  • 生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值

  • 生成器是一个不断产生值的函数

为什么要有生成器:

1)更节省存储空间

2)响应更迅速

3)使用更灵活

scrapy爬虫的使用步骤:

步骤1:创建一个工程和Spider模板

步骤2:编写Spider

步骤3:编写Item Pipeline

步骤4:优化配置策略

scrapy爬虫的数据类型:

Request类

Response类

Item类

Request类

class scrapy.http.Request()

Request对象表示一个HTTP请求

由Spider生成,由Downloader执行

1

Response类

class scrapy.http.Response(

Response对象表示一个HTTP响应

由Downloader生成,由Spider处理

2

Item类

class scrapy.item.Item()

Item对象表示一个从HTML页面中提取的信息内容

由Spider生成,由Item Pipeline处理

Item类似字典类型,可以按照字典类型操作

scrapy爬虫提取信息的方法

Scrapy爬虫支持多种HTML信息提取方法:

•Beautiful Soup

•lxml

•re

•XPath Selector

•CSS Selector

css selector的基本使用:

<HTML>.css('a::attr(href)').extract()

a->标签名称 href->标签属性

CSS Selector由W3C组织维护并规范

Donate? comment?