ScrapySheel(https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html)
Scrapy终端是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码。
其本意是用来测试提取数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码。
该终端是用来测试XPath或CSS表达式,查看他们的工作方式及从爬取的网页中提取的数据。
在编写您的spider时,该终端提供了交互性测试您的表达式代码的功能,免去了每次修改后运行spider的麻烦。
一旦熟悉了Scrapy终端后,您会发现其在开发和调试spider时发挥的巨大作用。
安装:
1、安装LXMl 一定要看多少版本的python来安装 系统多少位(https://pypi.org/project/lxml/)
pip install lxml
2、安装twisted 一定要看多少版本的python来安装 系统多少位(https://pypi.org/project/Twisted/)
pip install Twisted
3、安装Scrapy
pip install scrapy
关联安装
pip install pypiwin32
创建项目
在开始爬取之前,您必须创建一个新的Scrapy项目。 进入您打算存储代码的目录中,运行下列命令:
1、scrapy startproject tutorial(tutorial:项目的名称)
该命令将会创建包含下列内容的 tutorial 目录:
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件分别是:
scrapy.cfg: 项目的配置文件
tutorial/: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py: 项目中的item文件.
tutorial/pipelines.py: 项目中的pipelines文件.
tutorial/settings.py: 项目的设置文件.
tutorial/spiders/: 放置spider代码的目录.
2、新创建一个Spider(虫),您必须继承 scrapy.Spider 类, 且定义以下三个属性:
2.1、在项目中创建一个Spider(虫)
scrapy genspider 爬虫名 域名(不用加http,执行完本命令以后会在爬虫项目中出现一个新的py文件刷新)
name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。
后续的URL则从初始的URL获取到的数据中提取。
parse()是spider的一个构造方法。通过response响应中的数据都会在这个方法中, 该方法负责解析返回的数据(response data),
提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
import scrapy
class DmozSpider(scrapy.spiders.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"] #不能超过域名
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
//其中response是返回的数据
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
执行爬虫
进入项目(ScrapySheel)的根目录,执行下列命令启动spider:
scrapy crawl dmoz
crawl dmoz 启动用于爬取 dmoz.org 的spider
可以在DOC命令中使用 scrapy shell "http:\\www.baidu.com" 后返回一个response,可以用response.xpath('//title')等方式来获取数据
可通过Selector的4个基本方法来获取数据
xpath()
css()
extrct()这个返回的是一个list
re()正则表达式
例:
返回对象 选择器 选择器类型 获取值(/text()) 返回数据
response.selector. xpath('//title/text()'). extract()
response.selector. css('title::text'). extract()
一般是不用加selector