Pyqt5和Scrapy开发可视化爬虫
做了一个电商的爬虫,仅做学习使用
记录一下遇到的坑:
整个开发步骤为,利用scrapy爬几大电商网站的商品图片,然后开发UI,根据输入的信息,执行不同的爬虫。坑就主要在这个地方
1. 如何向scrapy爬虫传递配置信息,包括要爬取的电商网站(即要启动的spider),商品名称,数据库信息,图片保存路径?(不同的爬虫使用不同的配置)
scrapy框架,在settings.py中设置整个项目的配置信息,项目里面所有的spider公用一个配置,不同的爬虫,需要使用不同的配置,即使用不同的settings启动爬虫:
2019年4月23日更新
scrapy框架中,settings有其优先级,官方文档(scrapy-settings)中有如下说明:
设定可以通过多种方式设置,每个方式具有不同的优先级。 下面以优先级降序的方式给出方式列表:1. 命令行选项(Command line Options)(最高优先级)2. 每个spider的设定(customer_settings)3. 项目设定模块(Project settings module)4. 命令默认设定模块(Default settings per-command)5. 全局默认设定(Default global settings) (最低优先级)
1. 命令行指定设置(文档)
例:scrapy crawl myspider -s LOG_FILE=log.log -s IMAGES_SCORE=D:/images
2. 使用customer_settings
与命令行传参类似,通过custom_settings可以在spider中传入自定义的参数来修改settings
class JdSpider(scrapy.Spider):name = 'jd'allowed_domains = ['jd.com', 'p.3.cn', 'jd.hk']def __init__(self, name, images_store, host, port, username, password, db_name, ):self.keyword = name# 动态配置settingsself.custom_settings = {"IMAGES_STORE": images_store,"MYSQL_HOST": host,"MYSQL_USER": username,"MYSQL_PASSWORD": pasword,"MYSQL_PORT": port,"MYSQL_DBNAME": db_name,"MYSQL_CHARSET": 'utf8'}super(JdSpider, self).__init__() # 初始化父类放在最后,才能初始化父类的类变量...
2. 使用指定settings创建crawl
首先要知道如何使用脚本启动爬虫,scrapy提供了两种方式CrawlerProcess和CrawlerRunner,这里以CrawlerProcess为例:
crawl = CrawlerProcess(get_project_settings())
crawl.crawl(myspider)
crawl.start()
get_project_settings()获取的即为全局的设置,所以可以通过创建不同settings,或者修改全局的settings来启动爬虫
# 1. 创建settings
settings = Settings()
settings.set("ITEM_PIPELINES" , {'pipelines.DuplicatesPipeline': 200,'pipelines.IpProxyPoolPipeline': 300,
})
settings.set("DEFAULT_REQUEST_HEADERS",{'Accept': 'text/html, application/xhtml+xml, application/xml','Accept-Language': 'zh-CN,zh;q=0.8'}
)
settings.set("DOWNLOADER_MIDDLEWARES",{'useragent_middlewares.UserAgent': 1,'proxy_middlewares.ProxyMiddleware':100,'scrapy.downloadermiddleware.useragent.UserAgentMiddleware' : None,
}
)
settings.set("DOWNLOAD_DELAY",1)
settings.set("COOKIES_ENABLED",False)
settings.set("ROBOTSTXT_OBEY",True)# 2. 或修改项目settings
settings = get_project_settings()
settings.set('IMAGES_STORE', 'D:/images3')crawl = CrawlerProcess(settings)
crawl.crawl(myspider)
crawl.start()
2. UI主线程中开启子线程启动scrapy爬虫
scrapy一般用命令启动,在程序中,可以利用cmdline执行对应的命令来启动,可以利用scrapy内置的crawler类来启动(但由于在子线程中启动会有一些bug)。
开启一个子线程执行爬虫,并不断传递信号给主线程,来实时获取信息。但scrapy是一个独立的框架,无法把子线程中定义的信号,放到scrapy模块中去发送。
而scrapy框架自带的信号,也无法传递到scrapy外面?
所以需要使用一些其他的方法,来获取爬虫的运行情况。
一个是将信息写入文件中,从文件中获取,但必须在爬虫结束之后,才获取,另一个方法是开一个进程执行scrapy,并获取进程标准输出。
spider_cmdline = "scrapy crawl {} -a name={} --logfile=log.log".format(self.spider_name, self.keyword)p = subprocess.Popen(spider_cmdline, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)self.message_singal.emit(' 爬虫已启动')# 获取返回结果(百分比,和当前下载记录),信号返回两个变量while True:if subprocess.Popen.poll(p) is None: # 结束为-1,包含输出为空data = p.stdout.readline().decode('utf-8').strip()if data == 'close':self.message_singal.emit(data) # 发送内容else:print("data: ", data)if data.isdigit():self.percent_signal.emit(int(data)) # 发送进度信号else:# print("爬虫结束")# 杀死子进程self.message_singal.emit('爬虫完成,可关闭该窗口,进行其他爬虫任务')p.terminate()p.kill()breaktime.sleep(2)
另外:
PYQT5开启多个线程和窗口,多线程与多窗口的交互
PyQt5和Scrapy开发可视化爬虫(二)
Pyqt5和Scrapy开发可视化爬虫相关推荐
- 用PyQt5开发可视化爬虫软件
用PyQt5开发可视化爬虫软件 一些小伙伴知道怎么写爬虫,但是却不知道怎么给爬虫加上一个可视化操作界面,只是在IDE或者命令行窗口中运行py文件然后查看输出结果:而另一些可能知道怎么写简单的界面,但是 ...
- 利用scrapy和MongoDB来开发一个爬虫
利用scrapy和MongoDB来开发一个爬虫 今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询. 安装 ...
- 【19】数据可视化+爬虫:基于 Echarts + Python 实现的动态实时大屏范例 - bilibili排行榜
目录 ❤️效果展示❤️ 1.首先看动态效果图 2.丰富的主题样式 一. 确定需求方案 1.确定产品上线部署的屏幕LED分辨率 2.部署方式 二.整体架构设计 三.爬虫采集关键编码实现 1.确定爬虫目标 ...
- 开发网络爬虫应该怎样选择爬虫框架?
2019独角兽企业重金招聘Python工程师标准>>> 有些人问,开发网络爬虫应该选择Nutch.Crawler4j.WebMagic.scrapy.WebCollector还是其他 ...
- python可视化爬虫框架_8个最高效的Python爬虫框架
1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中..用这个框架可以轻松爬下来如亚马逊商品信息之类的 ...
- pythonscrapy爬虫_零基础写python爬虫之使用Scrapy框架编写爬虫
网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...
- python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)
对于 BOSS 直聘这种网站,当程序请求网页后,服务器响应内容包含了整个页面的 HTML 源代码,这样就可以使用爬虫来爬取数据.但有些网站做了一些"反爬虫"处理,其网页内容不是静态 ...
- 使用Scrapy框架编写爬虫
网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...
- python爬虫之使用Scrapy框架编写爬虫
转自:http://www.jb51.net/article/57183.htm 前面的文章我们介绍了Python爬虫框架Scrapy的安装与配置等基本资料,本文我们就来看看如何使用Scrapy框架方 ...
最新文章
- VMware或者KVM克隆的虚拟机网卡无法启动
- Linux内核开发之将驱动程序添加到内核
- Mysql数据库存储引擎--转
- 微信支付报错:统一下单和拉起支付的appid不一致(原创)
- 经典面试:当你输入一个网址后回车,实际会发生什么?
- android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...
- LeetCode 2039. 网络空闲的时刻(BFS)
- NuGet Error:Unable to find version ‘0.3.3.0‘ of package ‘glog.overlay-x64_v120_Release_dynamic‘.
- k8s nodeSelector和affinity
- 情人节,我用字符画出了一个对象!
- 子群和Lagrange定理
- 【Xamarin挖墙脚系列:卸载不彻底的解决】
- Child module pom.xml of pom.xml does not exist @
- 每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
- 中美联合挫败Conficker蠕虫大攻击
- SQL Server安装和修改身份验证方式
- 《特征工程入门与实践》读书笔记一
- 如何用python画房子_用python画一个小房子
- java实现打印金字塔
- 2022年全球市场救生艇总体规模、主要生产商、主要地区、产品和应用细分研究报告