博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

scrapy之核心组件、cookie、代理和日志等级

Posted on 2019-03-25 14:58  TigerAt  阅读(202)  评论(0)    收藏  举报

 

 

    • 引擎(Scrapy)
      用来处理整个系统的数据流处理, 触发事务(框架核心)
    • 调度器(Scheduler)
      用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
    • 下载器(Downloader)
      用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
    • 爬虫(Spiders)
      爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
    • 项目管道(Pipeline)
      负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

                 注:上述图中下载中间件(Downloader Middlewares)的作用是:拦截请求,可以将请求的ip进行更换(代理)

 【cookie】

1.需求:豆瓣网个人登录,获取该用户主页这个二级页面的页面数据

2.处理流程:

对爬虫文件中的start_requests方法进行重写。(ps:爬虫文件中的爬虫类继承到了Spider父类中的start_requests(self)这个方法,该方法默认对起始的url发起get请求,要想进行post请求,则需要子类重写该方法)

(1)直接将Reqeust方法中的请求方式更改为post,改变method属性即可(不推荐使用)

1     def start_requests(self):
2         for url in self.start_urls:
3             yield scrapy.Request(url=url,callback=self.parse,method='POST')

(2)使用FormRequest()进行post请求的发送(推荐使用)

 1 class DoubanSpider(scrapy.Spider):
 2     name = 'douban'
 3     #allowed_domains = ['https://accounts.douban.com/j/mobile/login/basic']
 4     start_urls = ['https://accounts.douban.com/j/mobile/login/basic']
 5     def start_requests(self):
 6         #post请求的参数:
 7         data = {
 8             'ck': '',
 9             'name': 'xxxxxxx',
10             'password': 'xxxxxx',
11             'remember': 'false',
12             'ticket': '',
13         }
14         for url in self.start_urls:
15             # yield scrapy.Request(url=url,callback=self.parse,method='POST')
16             #formdata:请求参数对应的字典
17             yield scrapy.FormRequest(url=url,formdata=data,callback=self.parse)

其它爬虫文件代码:

1     def cookie_test(self,response):
2         fp = open('./douban.html','w',encoding='utf-8')
3         fp.write(response.text)
4         fp.close()
5 
6     def parse(self, response):
7         #此url为个人主页的页面url,如果未进行登录则页面右上角显示的是未登录状态,如果已登录,则显示昵称信息
8         url = 'https://www.douban.com/people/TigerAt/'
9         yield scrapy.Request(url=url,callback=self.cookie_test)

未执行代码前页面效果:

执行代码之后的效果(没有样式了):

ps:由这个案例可以看出scrapy的cookie是不需要做任何操作的(如果有cookie),只要正常发起post请求就可以

【代理】

 1.需求:获取https://www.baidu.com/s?ie=utf-8&wd=ip页面的ip地址信息,使用代理替换掉请求ip

 2.实现流程:

(1)自定义下载中间件文件中的类,使其继承object父类

(2)重写process_request(self,request,spider)的方法

(3)在settings.py文件中开启中间件的开启。

3.代码实现:

(1)自定义类并重新process_request方法:

1 class baiduproxy(object):
2     def process_request(self, request, spider):
3         #请求IP的更换
4         request.meta['proxy']="http://134.209.52.62:8080"

(2)配置文件中开启中间件

1 # Enable or disable downloader middlewares
2 # See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
3 DOWNLOADER_MIDDLEWARES = {
4   #'proxy_demo.middlewares.ProxyDemoDownloaderMiddleware': 543,
5   'proxy_demo.middlewares.baiduproxy': 543,
6 }

(3)业务代码

 

1 class BaiduSpider(scrapy.Spider):
2     name = 'baidu'
3     #allowed_domains = ['https://www.baidu.com/s?ie=utf-8']
4     start_urls = ['https://www.baidu.com/s?ie=utf-8&wd=ip']
5 
6     def parse(self, response):
7         with open('./baiduIP.html','w',encoding='utf-8')  as fp:
8             fp.write(response.text)
9             print("数据写入完毕")

 

(4)实现结果

 【日志等级】

日志信息的种类:

ERROR : 一般错误

WARNING : 警告

INFO : 一般的信息

DEBUG : 调试信息(默认显示)

设置显示内容:

settings.py配置文件中,加入如下配置即可:

LOG_LEVEL = ‘指定日志信息种类’ #例如:LOG_LEVEL = ‘ERROR’

LOG_FILE = 'log.txt'  #'log.txt'表示在本地存储的文件名称

注:本内容仅供学习参阅,请勿他用。部分内容节选自:http://xiaobaibook.com/details/59/