
- 引擎(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/
浙公网安备 33010602011771号