演示HTML地址:http://python123.io/ws/demo.html
文件名称demo.html
步骤
1.建立一个Scrapy爬虫工程(路径是D:\pycodes)
>scrapy startproject python123demo(工程名)
会在D盘中生成外层目录python123demo/,
包含
scrapy.cfg(部署scrapy爬虫的配置文件);
python123demo/(scrapy框架中的用户自定义python代码),
包含
_init_.py(初始化脚本,用户不编写)、
items.py(Items代码模块,继承类,用户一般不编写)、
middlewares.py(Middlewares代码模块,继承类,如果需
要扩展,就写在此包中)、
pipelines.py(Pipelines代码模块,继承类)、
settings.py(Scrapy爬虫的配置文件)、
spiders/(Spiders代码模块目录,继承类)
包含
_init_.py(初始文件,无需修改)
_pycache_/(缓存目录,无需修改)
2.在工程中产生一个scrapy爬虫
>cd python123demo
>scrapy genspider demo python123.io(生成一个名称为demo的spider)
自动生成demo.py
# -*- coding:utf-8 -*-
import scrapy
class DemoSpider(scrapy.Spider):DemoSpider继承自scrapy.Spider
name="demo"
allowed_domains=["python123.io"]最开始用户提交的域名
start_urls=['http://python123.io/']爬取的初始页面
def parse(self,response):用于处理响应,解析内容形成字典,发现新的url爬取
pass 请求。
3.配置产生的spider爬虫
打开demo.py
将allowed_domains注释
将start_urls改为[‘http://python123.io/ws/demo.html’]
将parse函数爬取方法的具体功能改变
self:面向对象类所属关系的标记
response:从网络中返回内容所对应的对象
def parse(self,response):
fname=response.url.split(’/’)[-1] 定义文件的文字
with open(fname,‘wb’) as f: 将返回内容保存在文件
f.write(response.body)
self.log('Saved file %s. ’ % name)
4.运行爬虫,获取网页
python123demo>scrapy crawl demo(捕获文件存在demo.html中)
yield关键字
yield等价于生成器
生成器是一个不断产生值的函数
包含yield语句的函数是一个生成器
生成器在每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。
例子
def gen(n):
for i in range(n):
yield i**2
for i in gen(5):
print(i," ",end=" ")
0 1 4 9 16
生成器相比一次列出所有内容的优势:更节省存储空间,响应更迅速,使用更灵活。
scrapy爬虫的使用步骤
1.创建一个工程和spider模板
2.编写spider
3.编写Item Pipeline
4.优化配置策略
scrapy爬虫的数据类型
Requests类:代表向网络上提交请求的内容
class scrapy.http.Request()
Request对象表示一个Http请求
由spider生成,由Downloader执行
属性或方法:.url .method .headers .body .meta .copy()
Response类:代表从网络中爬取内容的封装类
class scrapy.http.Response()
Response对象表示一个Http请求
由Downloader生成,由spider处理
属性或方法:.url .status.headers .body .flags一组标记 .request .copy()
Item类:代表spider产生的信息封装类
class scrapy.item.Item()
Item对象表示一个从HTML页面中提取的信息内容
由spider生成,由Item Pipeline处理
Item类似字典类型,可以按照字典类型操作
scrapy爬虫提取信息的方法
Beautiful Soup
lxml
re
XPath Selector
CSS Selector
使用.css(‘a::attr(href)’).extract()
标签名称 标签属性