Scrapy框架高级操作
一 爬取多URL
实现同一个网址的多个url爬取
class QiubaiSpider(scrapy.Spider):name = 'qiubai'# allowed_domains = ['www.qiushibaike.com/text']start_urls = ['https://www.qiushibaike.com/text/']# 设计一个通用url模板url = 'https://www.qiushibaike.com/text/page/%d/'page_num = 1def parse(self, response):# 建议使用xpath进行解析(框架集成了xpath解析的接口)div_list = response.xpath('//div[@id="content-left"]/div ')# 存储解析到的页面数据data_list = []for div in div_list:# xpath解析到的指定内容存储到了Selector对象# extract()该方法可以将Selector对象存储中存储的数据值拿到author = div.xpath('./div/a[2]/h2/text()').extract_first()# extract_first = extract()[0]content = div.xpath('.//div[@class="content"]/span/text()').extract_first()# 将解析到的数据值(author和content)存储到items对象item = QiubaibypageseItem()item['author'] = authoritem['content'] = content# 将item对象提交给管道yield item# 请求的手动发送# 13表示最后一页页码if self.page_num <= 13:print("爬取到了第%d页的页面数据" % self.page_num)self.page_num += 1new_url = format(self.url % self.page_num)# callback:将去请求获取到的页面数据进行解析yield scrapy.Request(url=new_url, callback=self.parse)
二 发起post请求
# 将百度翻译中指定词条对应的翻译结果进行获取
class PostdemoSpider(scrapy.Spider):name = 'postDemo'# allowed_domains = ['www.baidu.com']start_urls = ['https://fanyi.baidu.com/sug']def start_requests(self):# 该方法其实是父类中的一个方法:该方法可以对star_urls列表中的元素进行get请求的fas# 发送post:# 将Request方法中method参数赋值成post# FormRequest()可以发起post请求(推荐)data = {'kw': 'dog'}print('start requests')for url in self.start_urls:yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse)def parse(self, response):print(response.text)
三 实现对cookie的操作
class DoubanSpider(scrapy.Spider):name = 'douban'start_urls = ['https://accounts.douban.com/j/mobile/login/basic']def start_requests(self):param_data = {'ck': 'dFf2','name': '18629090745','password': 'cs1993413','remember': 'false','ticket': ''}for url in self.start_urls:yield scrapy.FormRequest(url, formdata=param_data, callback=self.parse)def parseBySecondPage(self, response):# 指定个人页面数据进行解析fp = open('second.html', 'w', encoding='utf-8')fp.write(response.text)def parse(self, response):print(response.text)# 获取当前用户的个人主页url = 'https://www.douban.com/people/181322653/'yield scrapy.Request(url=url, callback=self.parseBySecondPage)
四 代理操作
下载中间件的作用: 拦截请求,可以将请求的ip进行更换
流程:
(1)下载中间件类的自制定
# 自定义一个下载中间件的类, 在类中事先process_request(处理中间件拦截到的请求)方法
# 自定义一个下载中间件的类, 在类中事先process_request(处理中间件拦截到的请求)方法 class MyProxy(object):def process_request(self, request, spider):# 请求ip的更换request.meta['proxy'] = "http://183.233.90.6:8080"
(2) 配置文件中进行下载中间件的开启
DOWNLOADER_MIDDLEWARES = {# 'postPro.middlewares.PostproDownloaderMiddleware': 543,'postPro.middlewares.MyProxy': 542, }
五 日志等级
日志等级
- ERROR:错误
- WARNING:警告
- INFO:一般的信息
- DEBUG:调试信息(默认输出)
在settins中修改:
# 指定终端输入指定种类的日志信息 LOG_LEVEL = 'ERROR' # 日志输出到指定的文件 LOG_FILE = 'log.txt'
六 携带请求参数
解决爬取的数据值不在同一页面中
# 需求:将1905电影网中电影详情进行爬取(名称, 类型, 导演, 评分, 剧情,演员)
class Moive195Spider(scrapy.Spider):name = 'moive195'# allowed_domains = ['http://www.1905.com']start_urls = ['http://www.1905.com/mdb/film/list/year-2018']# 用于解析二级子页面中的数据值def parseBySecondPage(self, response):Feature = response.xpath('/html/body/div[2]/div/div[1]/section[1]/div/p/text()').extract_first()director = response.xpath('/html/body/div[2]/section/div/div[2]/div[2]/a[1]/div[2]/text()').extract_first()# 取出Request方法的meta参数传递过来的字典(response.meta)item = response.meta['item']item['feature'] = Feature if Feature else ''item['director'] = director if director else ''# 将item提交给管道yield itemdef parse(self, response):div_list = response.xpath("/html/body/div[2]/div[1]/ul/li")for div in div_list:movie_name = div.xpath("./div/p[1]/a/text()").extract_first()href = div.xpath("./a/@href").extract_first()rank = div.xpath("./div/p[2]/b/text()").extract_first()actors = div.xpath("./div/p[3]/a/text()").extract()print(actors, '演员')movie_type = div.xpath("./div/p[4]/a/text()").extract_first()# 创建item对象item = ParsemoiveItem()item['name'] = movie_name if movie_name else ''item['movie_type'] = movie_type if movie_type else ''item['rank'] = rank if rank else ''item['actors'] = '/'.join(actors) if actors else ''# 需要对url发起请求,获取页面数据进行指定的解析url = 'http://www.1905.com/' + href# meta参数值可以赋值一个字典(将item对象先封装到一个字典中)yield scrapy.Request(url=url, callback=self.parseBySecondPage, meta={'item': item})
pipline.py
class ParsemoivePipeline(object):fp = Nonedef open_spider(self, spider):self.fp = open('movie.txt', 'w', encoding='utf-8')def process_item(self, item, spider):detail = item['name'] + ':' + item['movie_type'] + '' + item['rank'] + '' + item['director'] + "\n" + item['actors'] + "\n" + item['feature'] + "\n\n\n"self.fp.write(detail)return itemdef close_spider(self, spider):self.fp.close()
七 CrawlSpider
问题: 如果想要对某一个网站全站的数据进行爬取
解决方案:
- 1 手动请求的发送
- 2 CrawlSpider(推荐)
CrawlSpider概念
CrawlSpider其实就是Spider的一个子类。 CrawlSpider功能更加强大(链接提取器,规则解析器)
* 创建一个基于CrawlSpider的爬虫文件
scrapy genspider -t crawl 爬虫名称 起始url
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ruleclass CrawlchoutiSpider(CrawlSpider):name = 'crawlchouti'# allowed_domains = ['dig.chouti.com']start_urls = ['https://dig.chouti.com/']# 实例化了一个链接提取器对象# 链接提取器:用来提取指定的链接(url)# allow参数:赋值一个正则表达式# 链接提取器可以根据正则表达式在页面提取指定的链接# 提取到的链接会全部交给规则解析器link = LinkExtractor(allow=r'/all/hot/recent/\d+')rules = (# 实例化了一个规则解析器对象# 规则解析器接受了链接提取器发送的链接后,就会对这些链接发起请求,获取链接对应的页面内容, 就会根据指定的规则对页面内容中指定的数据值进行解析# callback:指定一个解析规则(方法/函数)# follow:是否将链接提取器继续作用到链接提取器提出的链接所表示的页面数据Rule(link, callback='parse_item', follow=False),)def parse_item(self, response):print(response)
八 scrapy图片数据爬取
基于文件下载的管道类
在scrapy中我们之前爬取的都是基于字符串类型的数据,那么要是基于图片数据的爬取,那又该如何呢?
- 其实在scrapy中已经为我们封装好了一个专门基于图片请求和持久化存储的管道类ImagesPipeline,那也就是说如果想要基于scrapy实现图片数据的爬取,则可以直接使用该管道类即可。
magesPipeline使用流程
- 在配置文件中进行如下配置:
IMAGES_STORE = ‘./imgs’:表示最终图片存储的目
管道类的编写
from scrapy.pipelines.images import ImagesPipelineimport scrapyclass ImgproPipeline(object):item = Nonedef process_item(self, item, spider):# print(item)return item#ImagesPipeline专门用于文件下载的管道类,下载过程支持异步和多线程class ImgPipeLine(ImagesPipeline):#对item中的图片进行请求操作def get_media_requests(self, item, info):yield scrapy.Request(item['src'])#定制图片的名称def file_path(self, request, response=None, info=None):url = request.urlfile_name = url.split('/')[-1]return file_namedef item_completed(self, results, item, info):return item #该返回值会传递给下一个即将被执行的管道类
转载于:https://www.cnblogs.com/harryblog/p/11362534.html
Scrapy框架高级操作相关推荐
- scrapy获取a标签的连接_Python爬虫 scrapy框架初探及实战!
Scrapy框架安装 操作环境介绍 操作系统:Ubuntu19.10 Python版本:Python3.7.4 编译器:pycharm社区版 安装scrapy框架(linux系统下) 安装scrapy ...
- Python爬虫-- Scrapy框架
Scrapy框架 Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码.对于会阻塞线程的操作包含访问文件.数据库或者Web.产生新的进程并需要 ...
- python爬虫之无界面模式操作/scrapy框架
文章目录 前情回顾 cookie模拟登陆 三个池子 selenium+phantomjs/chrome/firefox 今日笔记 chromedriver设置无界面模式 selenium - 键盘操作 ...
- 爬虫Spider 08 - chromedriver设置无界面模式 | selenium - 键盘操作 | 鼠标操作 | 切换页面 | iframe子框架 | scrapy框架
文章目录 Spider 07回顾 cookie模拟登陆 三个池子 selenium+phantomjs/chrome/firefox Spider 08 笔记 chromedriver设置无界面模式 ...
- Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)
文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...
- 6 scrapy框架之分布式操作
分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux: redis-server redis.conf windows: redis-server.exe redis-wi ...
- scrapy框架之分布式操作
分布式概念 分布式爬虫:1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取.2.原生的scrapy是不可以实现分布式爬虫?a)调度器无法共享b)管道无法共享3.scrapy-redis ...
- Scrapy框架采集微信公众号数据,Python大佬机智操作绕过反爬验证码
前情提要 此代码使用scrapy框架爬取特定"关键词"下的搜狗常规搜索结果,保存到同级目录下csv文件.并非爬取微信公众号文章,但是绕过验证码的原理相同.如有错误,希望大家指正. ...
- 云计算学习素材框架,msyql高级操作课件
在本篇文章中将给大家讲解下msyql高级操作: 连接数据库 mysql -uroot -p -h10.18.44.209 -p3306 授权 GRANT ALL PRIVILEGES ON . TO ...
最新文章
- BERT 预训练模型及文本分类(情感分类)
- python编写表格程序_python对excel表格的操作
- python绘制数字_#0000在一个图片上画一个数字
- 次世代3d游戏建模,零基础的小白可以学吗?
- linux6 安装oracle11g
- vue 地图使用navigator_初识ABP vNext(6):vue+ABP实现国际化
- VB.NET C++ VB 编程语言
- PSINS捷联惯导更新算法
- WPF+VB.net制作桌面股票小助手
- c语言vt指令,VT系列一:VT简述
- 少儿编程微课程7:星际飞行单机版
- OpenSSL密码库算法笔记——第 2.2.4章 Barrett模数与相关函数
- [转]最速下降曲线:重力场中两点之间曲线更快
- 滤波算法一(C程序)
- 特步官网、商城、APP都部署在阿里云上
- xml 03练习 xml案例(考生成绩管理系统)
- matlab m_map绘制中国行政区划 political region
- HTTP协议常问的面试题(吐血整理)
- QQ 浏览器品牌升级,提出「搜刷用看」四项核心功能
- Matlab绘制圆柱侧面