做了一个电商的爬虫,仅做学习使用

记录一下遇到的坑:
整个开发步骤为,利用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开发可视化爬虫相关推荐

  1. 用PyQt5开发可视化爬虫软件

    用PyQt5开发可视化爬虫软件 一些小伙伴知道怎么写爬虫,但是却不知道怎么给爬虫加上一个可视化操作界面,只是在IDE或者命令行窗口中运行py文件然后查看输出结果:而另一些可能知道怎么写简单的界面,但是 ...

  2. 利用scrapy和MongoDB来开发一个爬虫

    利用scrapy和MongoDB来开发一个爬虫 今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询. 安装 ...

  3. 【19】数据可视化+爬虫:基于 Echarts + Python 实现的动态实时大屏范例 - bilibili排行榜

    目录 ❤️效果展示❤️ 1.首先看动态效果图 2.丰富的主题样式 一. 确定需求方案 1.确定产品上线部署的屏幕LED分辨率 2.部署方式 二.整体架构设计 三.爬虫采集关键编码实现 1.确定爬虫目标 ...

  4. 开发网络爬虫应该怎样选择爬虫框架?

    2019独角兽企业重金招聘Python工程师标准>>> 有些人问,开发网络爬虫应该选择Nutch.Crawler4j.WebMagic.scrapy.WebCollector还是其他 ...

  5. python可视化爬虫框架_8个最高效的Python爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中..用这个框架可以轻松爬下来如亚马逊商品信息之类的 ...

  6. pythonscrapy爬虫_零基础写python爬虫之使用Scrapy框架编写爬虫

    网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...

  7. python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)

    对于 BOSS 直聘这种网站,当程序请求网页后,服务器响应内容包含了整个页面的 HTML 源代码,这样就可以使用爬虫来爬取数据.但有些网站做了一些"反爬虫"处理,其网页内容不是静态 ...

  8. 使用Scrapy框架编写爬虫

    网络爬虫,是在网上进行数据抓取的程序,使用它能够抓取特定网页的HTML数据.虽然我们利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间.Scrapy是一个使用Python编写的,轻 ...

  9. python爬虫之使用Scrapy框架编写爬虫

    转自:http://www.jb51.net/article/57183.htm 前面的文章我们介绍了Python爬虫框架Scrapy的安装与配置等基本资料,本文我们就来看看如何使用Scrapy框架方 ...

最新文章

  1. VMware或者KVM克隆的虚拟机网卡无法启动
  2. Linux内核开发之将驱动程序添加到内核
  3. Mysql数据库存储引擎--转
  4. 微信支付报错:统一下单和拉起支付的appid不一致(原创)
  5. 经典面试:当你输入一个网址后回车,实际会发生什么?
  6. android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...
  7. LeetCode 2039. 网络空闲的时刻(BFS)
  8. NuGet Error:Unable to find version ‘0.3.3.0‘ of package ‘glog.overlay-x64_v120_Release_dynamic‘.
  9. k8s nodeSelector和affinity
  10. 情人节,我用字符画出了一个对象!
  11. 子群和Lagrange定理
  12. 【Xamarin挖墙脚系列:卸载不彻底的解决】
  13. Child module pom.xml of pom.xml does not exist @
  14. 每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
  15. 中美联合挫败Conficker蠕虫大攻击
  16. SQL Server安装和修改身份验证方式
  17. 《特征工程入门与实践》读书笔记一
  18. 如何用python画房子_用python画一个小房子
  19. java实现打印金字塔
  20. 2022年全球市场救生艇总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. GLAD应用:体全息光栅模拟
  2. JDK11你必须了解的新特性
  3. 到底什么是虚数?是人为定义还是真实存在的?
  4. “会员制营销”和“EMAIL营销”培训方案
  5. 安全系统工程 张景林2014_安全系统工程 第二版 [张景林 主编] 2014年版
  6. 华为 CE系列交换机配置radius认证
  7. 小程序根据经纬度计算两点距离
  8. 几个超级大美女和大佬的搞钱经历!
  9. 利用Web Audio API将振动数据转化为音频数据并播放
  10. MATLAB中关于函数intlinprog的使用