爬虫scrapy框架入门

O、知识框架

爬虫scrapy框架入门

 

一、初步概念

  Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

  1.requests+selenium能解决90%的爬虫需求&scrapy加速

  2.scrapy使用了Twisted异步网络框架,加快下载速度。Twisted学习:https://www.cnblogs.com/chenyang920/p/7923364.html异步且非阻塞。

  3.视频学习:https://www.bilibili.com/video/av37438466笔记1:scrapy框架 | 爬虫课程,笔记2:https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html

二、安装

1. pythonIDE安装scrapy

  在anaconda的Prompt控制台直接使用pip install scrapy,遇到building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools,需要先安装Twisted框架,查找安装过程:Collecting Twisted>=13.1.0 (from scrapy)..Downloading…。记住Twisted的版本号,点击https://www.lfd.uci.edu/~gohlke/pythonlibs/这个网址下载对应的whl文件,在Prompt控制台上,进入该文件位置,利用pip install xxx命令安装该文件,再使用pip install scrapy,即可安装成功。

2.搞定Header

  首先在Chrome控制台抓到的数据上点击鼠标左键→Copy→Copy as cURL。再访问https://curl.trillworks.com/,在“curl command”中将刚才拷贝的cURL粘贴进去,右边将自动生成Python代码。

3.使用Fidder抓包

  https://www.cnblogs.com/zhaoyanjun/p/7068905.html

 三、scrapy工作流程

爬虫scrapy框架入门

 

  1.调度器把requests-->引擎-->下载中间件--->下载器

  2.下载器发送请求,获取响应---->下载中间件---->引擎--->爬虫中间件--->爬虫

  3.爬虫提取url地址,组装成request对象---->爬虫中间件--->引擎--->调度器

  4.爬虫提取数据--->引擎--->管道

  5.管道进行数据的处理和保存

 四、实战

1.在Anaconda Prompt控制台下切换到工作路径(xxx为自定义名字):

  1)创建一个scrapy项目:scrapy startproject xxx

  2)生成一个爬虫:scrapy genspider xxx xxx.com,前一个为爬虫名,后一个为允许爬取的范围。

  3)在项目文件夹下面启动爬虫:scrapy crawl xxx

2.extract()与extract_first()

  extract()返回一个包含有字符串的列表,extract_first() 返回列表中的第一个字符串,列表为空没有返回None。

3.Pipeline

  1)setting里面将Pipeline启动,多个Pipeline权重越小优先级越高。

  2)为了让数据在Pipeline中传递,要用return。

  3)Pipeline中的process_item方法名不能修改为其他的名称。

4. spider中的parse方法必须有。

5. response.xpath方法的返回结果是一个类list的类型,其中包含的是selector对象,操作和列表一样,但是有一些额外的方法。

6.yield

  1)yield使得这个函数编程一个生成器。

  2)yield能够传递的对象只能是:BaseItem,Request,dict,None。

  3)遍历这个函数的返回值的时候,挨个把数据读到内存,不会造成内存的瞬间占用过高。

7.logging

  1)若要控制台不输出日志,在setting.py中设置:LOG_LEVEL=”WARNING”。保存日志只需加上LOG_FILE=xxx.txt。(也可在运行命令时附加-s LOG_FILE=xxx.txt)。

  2)import logging,实例化logger的方式在任何文件中使用logger输出内容。

  3)普通项目:import logging,logging.basicConfig(…)#设置日志输出的样式和格式,实例化一个logger=logging.getLogger(….namin),在其他文件中调用Logger使用。

8.翻页请求                                 

  1)找到下一页的url地址。

  2)构造url地址的请求,scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False]) 注:中括号中的参数为可选参数。

    callback:表示当前的url的响应交给哪个函数处理。

    meta:实现数据在不同的解析函数中传递,meta默认带有部分数据,如下载延迟、请求深度等。

    dont_filter:默认为False,会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Ture,比如贴吧的翻页请求,页面的数据总是在变化;start_urls中的地址会被反复请求,否则程序不会启动。

    method:指定POST或GET请求。

    headers:接收一个字典,其中不包括cookies。

    cookies:接收一个字典,专门放置cookies。

    body:接收一个字典,为POST的数据。

  3)传递给引擎。yield scrapy.Request(url,callback)

  4)在settings中设置ROBOTS协议。

    # False表示忽略网站的robots.txt协议,默认为True——ROBOTSTXT_OBEY = False

  5)item

    定义item即提前规划好哪些字段需要抓取,scrapy.Field()仅仅是提前占坑。在python大多数框架中,大多数框架都会自定义自己的数据类型(在python自带的数据结构基础上进行封装),目的是增加功能,增加自定义异常。

    Item使用之前需要先导入并且实例化,之后的使用方法和使用字典相同

9.scrapy模拟登录

  1)携带cookies直接获取需要登录后的页面:重构scrapy的starte_rquests方法(如果start_url地址中的url是需要登录后才能访问的url地址,则需要重写start_request方法并在其中手动添加上cookie);cookie不能够放在headers中,在构造请求时有专门的cookies参数,能够接受字典形式的cookie;在setting中设置ROBOTS协议、USER_AGENT

  2)找到url地址,发送post请求存储cookie。

  3)找到对应的form表单,自动解析input标签,自动解析post请求的url地址,自动带上数据,自动发送请求。通过scrapy.FormRequest能够发送post请求,同时需要添加formdata参数作为请求体,以及callback——scrapy.FormRequest(url,formdata={需要用户填写的键对值},…)。scrapy.FormRequest.from_response()发送表单请求,接收的是response。