Scrapy 是一个为了爬取网站数据, 提取结构性数据而编写的应用框架, 非常出名, 非常强悍. 所谓的框架就是一个已经被集成了各种功能 (高性能异步下载, 队列, 分布式, 解析, 持久化等) 的具有很强通用性的项目模板
scrapy 安装
Linux 安装:
pip3 install scrapy
Windows 安装:
a. pip3 install wheel
b. 下载 twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
c. 进入下载目录, 执行 pip3 install Twisted?17.1.0?cp35?cp35m?win_amd64.whl
- d. pip3 install pywin32
- e. pip3 install scrapy
基础使用:
创建项目:
scrapy startproject 项目名称
项目结构:
- project_name/
- scrapy.cfg:
- project_name/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
scrapy.cfg 项目的主配置信息.(真正爬虫相关的配置信息在 settings.py 文件中)
items.py 设置数据存储模板, 用于结构化数据, 如: Django 的 Model
pipelines 数据持久化处理
settings.py 配置文件, 如: 递归的层数, 并发数, 延迟下载等
spiders 爬虫目录, 如: 创建文件, 编写爬虫解析规则
创建爬虫应用程序:
cd project_name(进入项目目录)
scrapy genspider 应用名称 爬取网页的起始 url (例如: scrapy genspider qiubai www.qiushibaike.com)
修改 settings.py 配置文件
修改内容及其结果如下:
19 行: USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) ApplewebKit/537.36 (Khtml, like Gecko) Chrome/68.0.3440.106 Safari/537.36' #伪装请求载体身份
22 行: ROBOTSTXT_OBEY = False #可以忽略或者不遵守 robots 协议
执行爬虫程序
scrapy crawl 应用名称
scrapy crawl 应用程序 --nolog #忽略日志
编写爬虫文件: 在步骤 2 执行完毕后, 会在项目的 spiders 中生成一个应用名的 py 爬虫文件
- # -*- coding: utf-8 -*-
- import scrapy
- class FirstSpider(scrapy.Spider):
- #爬虫文件的名称, 就是爬虫文件的一个唯一标识
- name = 'first'
- #允许的域名, 通常注释掉
- # allowed_domains = ['www.xxx.com']
- #起始 url 列表, 列表元素都会被自动的进行请求的发送
- start_urls = ['http://www.xxx.com/']
- #解析数据
- def parse(self, response):
- #获取字符串类型的响应内容
- print(response.text)
- #获取字节类型的响应内容
- print(response.body)
- #对响应数据进行解析
- response.xpath()
将糗百首页中段子的内容和标题进行爬取
- # -*- coding: utf-8 -*-
- import scrapy
- class QiubaiSpider(scrapy.Spider):
- name = 'qiubai'
- allowed_domains = ['https://www.qiushibaike.com/']
- start_urls = ['https://www.qiushibaike.com/']
- def parse(self, response):
- #xpath 为 response 中的方法, 可以将 xpath 表达式直接作用于该函数中
- odiv = response.xpath('//div[@id="content-left"]/div')
- content_list = [] #用于存储解析到的数据
- for div in odiv:
- #xpath 函数返回的为列表, 列表中存放的数据为 Selector 类型的数据. 我们解析到的内容被封装在了 Selector 对象中, 需要调用 extract()函数将解析的内容从 Selecor 中取出.
- author = div.xpath('.//div[@class="author clearfix"]/a/h2/text()')[0].extract()
- content=div.xpath('.//div[@class="content"]/span/text()')[0].extract()
- #将解析到的内容封装到字典中
- dic={
- '作者':author,
- '内容':content
- }
- #将数据存储到 content_list 这个列表中
- content_list.append(dic)
- return content_list
持久化保存, 只能键 parse 方法的返回值存储到磁盘文件中
scrapy crawl first -o qiubai.CSV # -o 后跟文件的路径
来源: http://www.bubuko.com/infodetail-3049228.html