引擎是核心,将请求发送到进程Schedule,进程将之交给下载器从互联网获取请求,得到responses返回给spider,一个项目下的spider可以有多个。
spider的功能是执行爬取动作,然后解析响应,得到数据或者新的url,然后将数据递交给Item Pipeline或是将url递交给Schedule。
Item Pipeline则进行数据的清洗,补充与保存。
——————
scrapy框架的安装:pip install scrapy
Scrapy 命令分为两种:全局命令(使用scrapy –h可以查看) 和项目命令
打开命令行(这里可以Win+R:打开运行;输入cmd来打开命令行),输入scrapy:
以下是全局命令:
'''
Usage:
scrapy [options] [args] #用法:命令 选项 参数
Available commands:
bench Run quick benchmark test
#运行快速基准测试
fetch Fetch a URL using the Scrapy downloader
#使用scrapy下载器获取URL的内容
genspider Generate new spider using pre-defined templates
#使用预设置模板生成新的爬虫
runspider Run a self-contained spider (without creating a project)
#无需创建项目的情况下。运行一个独立的爬虫
settings Get settings values
#获取配置信息
shell Interactive scraping console
#互动式爬取控制台,用于临时的交互的爬虫操作
startproject Create new project
#创建一个新爬虫项目
version Print Scrapy version
#获得scrapy的版本
view Open URL in browser, as seen by Scrapy
#使用Scrapy下载器获取URL并在浏览器中显示其内容
[ more ] More commands available when run from project directory
'''
命令行输入"scrapy -h"以获取命令的详细信息
项目命令的详细必须进入项目后执行:scrapy -h
结果如下:许多命令与全局命令重复,重点补充不重复的命令。
Available commands:
bench Run quick benchmark test
check Check spider contracts
crawl Run a spider
#执行爬虫 接爬虫名称
edit Edit spider
fetch Fetch a URL using the Scrapy downloader
genspider Generate new spider using pre-defined templates
list List available spiders
#显示当前项目下的所有爬虫名称
parse Parse URL (using its spider) and print the results
runspider Run a self-contained spider (without creating a project)
settings Get settings values
shell Interactive scraping console
startproject Create new project
version Print Scrapy version
view Open URL in browser, as seen by Scrapy
Use "scrapy -h" to see more info about a command
D:\python\Python37\Practise>cd scrapy
D:\python\Python37\Practise\Scrapy>scrapy startproject demo
D:\python\Python37\Practise\Scrapy_inn>cd demo
D:\python\Python37\Practise\Scrapy_inn\demo>scrapy genspider fang fang.5i5j.com
Created spider ‘fang’ using template ‘basic’ in module:
demo.spiders.fang
- demo 项目
- spiders 爬虫主体
- __init__.py 配置文件
- items.py 定义数据结构
- middlewares.py
- pipelines.py 定义数据管道
- settings.py 项目全局配置
- scrapy.cfg scrapy部署时的配置文件
这样得到的爬虫主体 fang.py:
# -*- coding: utf-8 -*-
import scrapy
class FangSpider(scrapy.Spider):
name = 'fang'
allowed_domains = ['fang.5i5j.com']
start_urls = ['https://fang.5i5j.com']
def parse(self, response):
pass
• 在Scrapy中抓取网站的链接配置、抓取逻辑、解析逻辑里都是在Spider中配置的。
• Spider要做的事就是有两件:定义抓取网站的动作 和 分析爬取下来的网页。
——
• 对应Spider类,整个抓取循环过程如下所述:
yield
传递出去。scrapy.Request(url=url,callback=self.parse)
。#传入url,并设置回调函数——
Spider类分析:基类
• Spider类继承自scrapy.spiders.Spider.
• Spider类这个提供了start_requests()
方法的默认实现,读取并请求start_urls
属性,并调用parse()
方法解析结果。
——
start_requests()
方法时,默认会从这个列表开 始抓取。from_crawler()方法
设置的,Crawler对象包含了很多项目组件,可以获取 settings等配置信息。————
————
爬虫是在命令行执行的。命令行会显示执行的细节。
执行爬虫时首先得到相应,值为200正常,之后scrapy会访问robots.txt,如果协议拒绝爬虫访问,那么就会抛出异常,结束访问。
解决方法:打开项目下的settings,找到ROBOTSTXT_OBEY将之修改为False即可。
但是这样得到的爬虫数据是禁止商业使用的,否则会发生法律纠纷。
——
解析出来的url通过response.urljoin(url)
来构建绝对地址。
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件按照 一定的顺序 执行对Item的处理。
每个item pipeline组件是实现了简单方法的 Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。
——
以下是item pipeline的一些典型应用:
————
————
每个item pipiline组件是一个独立的 Python类,同时必须实现以下方法:
————
————
当需要封装数据时,需要先修改项目下的items.py文件,我们创建的item类是继承自scrapy.Item。
封装的数据的格式如name=scrapy.Field(),有多少类数据需要封装就创建多少条目。
item pipeline执行数据保存框架:
import pymysql
def open_spider(self,spider):
self.db=pymysql.connect(self.host,self.user,self.password,self.database,self.port,charset="utf8")
self.cursor=self.db.cursor()
def process_item(self,item,spider):
#这里的csdnedu是表名
sql="insert into csdnedu(title,url,pic,teacher,time,price) value(%s,%s,%s,%s,%s,%s)"%()
self.cursor.execute(sql)
self.db.commit()
return item
def close_spider(self,spider):
self.db.close()
————
————
那么如何连接数据库?在self.db=pymysql.connect()
里添加账号密码?事实上项目是会转移的,如果这里写死了参数转移后就需要修改,所以一个好的方法是将数据放在settings里,而连接数据库这里采用模块的写法。
给item pipeline做初始化:
class CsdneduPipeline(object):
def __init__(self,host,user,password,database,port):
self.host=host
self.user = user
self.password = password
self.database = database
self.port = port
@classmethod
def from_crawler(cls,crawler):
return cls(
host=crawler.settings.get("MYSQL_HOST"),
user = crawler.settings.get("MYSQL_USER"),
password = crawler.settings.get("MYSQL_PASSWORD"),
database=crawler.settings.get("MYSQL_DATABASE"),
port=crawler.settings.get("MYSQL_PORT"),
)
给settings做修改:
ITEM_PIPELINES = {
'csdnedu.pipelines.setPipeline': 300,
'csdnedu.pipelines.CsdneduPipeline': 301,
}
MYSQL_HOST="localhost"
MYSQL_DATABASE=""
MYSQL_USER="root"
MYSQL_PASSWORD=""
MYSQL_PORT=""
即可。
1、scrapy实践I :csdn学院网课信息