1、整体架构
engine负责数据的转发/调度工作
- spiders 发起请求requests经过engine引擎
- engine发送到调度器scheduler进行排队,去重
- 将排好队的请求再次发给引擎engine
- 引擎将请求经过下载中间件(加头,加代理,加cookie,集成selenium)给下载器,异步发请求
- 将返回的数据经过中间件返回给引擎
- 引擎将返回的数据经过爬虫中间件返回给解析
- 解析后将数据再次经过爬虫中间件给引擎,如果解析的数据中还有请求requests对象会继续走2 3 4 5 6 7 8
- 引擎将items对象到项目管道做清理,持久化
-crawl_chouti # 项目名
-crawl_chouti # 跟项目一个名,文件夹
-spiders # spiders:放着爬虫 genspider生成的爬虫,都放在这下面
-__init__.py
-work.py # 具体的业务逻辑
-items.py # 对比django中的models.py文件 ,写一个个的模型类
-middlewares.py # 中间件(爬虫中间件,下载中间件),中间件写在这
-pipelines.py # 写持久化的地方(持久化到文件,mysql,redis,mongodb)
-settings.py # 配置文件
-scrapy.cfg # 不用关注,上线相关的
2、用到的插件
2.1、selenium + phantomjs
selenium可以用于模拟点击
phantomjs可以将页面渲染 然后直接获取里面的内容
2.2、Appium
app的测试框架 功能与selenium相似 用于app上
2.3、mitmproxy
用于拦截网络请求的内容 并进行修改
3、主要数据结构
3.1、Spider
1、request
Request(url, callback=None, method='GET', headers=None, body=None,
cookies=None, meta=None)
2、response
有三个实现类
TextResponse
HtmlResponse
XmlResponse
重要的属性:
meta:request传递的字典
selecter: 封装了beautifulsoup 有xpath和css方法
xpath:
css:
urljoin:构建绝对路径
Response(url, status=200, headers=None, body=b'',
request=None)
3、spider
//继承Spider
class QuotesSpider(scrapy.Spider):
name = "quotes"
//设置初始url
start_urls = ['https://api.github.com/events'];
//解析
def parse(self, response):
3.2、Item
用于自定义数据类 操作和字典类似
Item为基类 Field为定义的字段
class BookItem(scrapy.Item):
name = field()
3.3、Item pipeline
清洗数据
验证数据有效性
过滤重复数据
存入数据库
1、实现process_item.py
//打开关闭只会执行一次 可以做初始化操作
def open_spider(self, spider)
def close_spider(self, spider)
//执行具体逻辑
def process_item(self, item, spider)
2、在settings.py中配置
pipeline会按照顺序执行 后面数字越小 越先执行
ITEM_PIPELINES = {
'tutorial.pipelines.TutorialPipeline': 300,
}
3.4、下载文件、图片
FilesPipeline/ImagePipline
3.5、模拟登录
FormRequest
3.6、http代理
3.7、分布式爬虫
参考:
https://github.com/wistbean/learn_python3_spider
https://www.cnblogs.com/Mr-shen/p/12676185.html
<精通scrapy网络爬虫.pdf>