Scrapy框架原理
Scrapy异步框架核心原理
- 同步与异步
- Scrapy运行原理
同步与异步
同步:是下一个方法依赖于上一个方法的结果
异步:下一个方法不依赖于上一个方法的结果
同步爬虫程序的问题:
href_s = [url1,url2,url3]
for href in href_s:
response = urlopen(href).read()
//处理response
只有前一个url被访问时才能继续访问,前端向服务器发出访问和得到响应的时间过长
异步解决问题:
每个url会各自与服务器发现访问和响应,可以同时进行。
Scrapy运行原理
Scrapy项目创建与配置
- Scrapy的安装
- 项目创建
- 基本配置
- 入门案例
项目创建
- 创建项目 >> scrapy startproject 【项目名字】
- 进入项目 >> cd 【项目名字】
- 创建爬虫文件 >> scrapy genspider 【爬虫名字】 “【HOST地址】“
- 运行爬虫文件 >> scrapy crawl 【爬虫名字】
基本配置
Settings中的常用配置: USER_AGENT = "" # User-Agent
ROBOTSTXT_OBEY = True|Flase # 是否遵守机器人协议
DEFAULT_REQUEST_HEADERS = {
} # 默认Headers
CONCURRENT_REQUESTS = 16 # 下载器最大处理的请求数
DOWNLOAD_DELAY = 3 # 下载延时
SPIDER_MIDDLEWARES # Spider中间件
DOWNLOADER_MIDDLEWARES # Downloader中间件
ITEM_PIPELINES # 管道文件
Spider中的属性和方法:
# 爬虫名字
name = 's1'
# 如果URL地址的HOST不属于allowed_domains,则过滤掉该请求
allowed_domains = ['edu.csdn.net']
# 项目启动时,访问的URL地址
start_urls = ['http://edu.csdn.net/']
# 访问start_urls,得到响应后调用的方法
def parse(self, response): # response为响应对象
pass
# 爬虫开始,执行的方法,相当于start_urls
def start_requests(self):
yield scrapy.Request( # 向调度器发送一个Request对象
url='http://edu.csdn.net', # 请求地址,默认Get方式
callback=self.parse2 # 得到响应后,调用的函数
)
def parse2(self,response): # 得到响应后,调用的函数
print(response.body) # 得到字节类型的数据
中间件的应用
配置DownlaoderMiddleware,可设置代理IP
# -*- coding: utf-8 -*-
# Define here the models for your spider middleware
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/spider-middleware.html
from scrapy import signals
from scrapy.http.headers import Headers
from myscrapy1 import user_agent
import urllib.request as ur
class Myscrapy1SpiderMiddleware(