宜家产品刮板

hemnes的Python项目详细描述


血红素

报告错误 · 请求功能

目录

关于项目

hemnes是一个pip包,用于从宜家(ikea)中删除产品数据,这是因为重写刮板是浪费时间。Hemnes让您能够在30秒内查询宜家的产品目录(我没有计时)。

以下产品数据由Hemnes收集

  • 名称(str)-产品名称
  • id(str)-唯一的产品id
  • 价格(浮动)-产品价格
  • url(str)-产品页面的url
  • 评级(浮动)-平均客户评级
  • img_url(list[str])-产品图像的url
  • 颜色(list[str])-产品颜色(请参见hemnes/helpers/find嫒element中的颜色以获取正在搜索的颜色的完整列表)

Hemnes配备了一些有用的功能,用于执行以下操作:

  • 查找描述中包含特定关键字的产品
  • 日志记录
  • 将结果写入json

在此处阅读有关扩展功能的更多信息

使用

构建

为什么是selenium,或者为什么不是python请求

如果你快速浏览一下关于刮宜家的栈溢出帖子——或者你正在考虑自己写一个刮器——你可能会遇到一些人使用selenium webdriver来处理不需要它的页面。不过,selenium比python请求重,webdriver可以加载角度生成的内容,而请求不能

宜家家居租赁网站使用角度搜索结果。这与以前的搜索有所不同,后者可以通过python请求访问。新的搜索提供了更准确的结果和更少的垃圾。从经验上讲,旧的搜索非常糟糕,它为任何一个我无法连接回原始搜索的给定查询提供了大量垃圾结果(例如,旧的搜索为"table"返回58页结果,其中包括placemats和狗玩具;新的搜索返回15,所有结果实际上都是表)

入门

hemnes的安装和使用非常简单。它的功能与您期望的web抓取包的功能完全相同-输入查询并返回结果。

运行时

  • 巨蟒3+

安装

hemnes使用标准pip安装。要从pypi安装,请运行

pip3 install hemnes

或者,您可以克隆repo,然后在目录中运行pip install

# clone the repository
git clone https://github.com/sayeefrmoyen/hemnes.git
cd hemnes
pip3 install . # install the current directory as a package

铬驱动器

hemnes使用chromedriver加载网页。如果chromedriver已经安装并且位于系统路径上,则可以跳过本节的其余部分。

要使用chromedriver,您需要安装google chrome。如果您已经安装了google chrome我相信您应该能够运行hemnes而不会出现问题。对于完整的披露,我不熟悉google chrome或chrome驱动程序代码,也不知道它们是如何交互的,但是在运行hemnes时,如果没有显式安装chrome driver二进制文件,我就不会遇到任何问题。

尽管如此,selenium的webdriver文档建议您同时安装google chrome和chromedriver版本。如果您发现在安装google chrome之后您仍然收到关于chromedriver的错误,那么您应该继续安装chromedriver

此时,您应该准备好开始使用hemnes。

基本用法

最简单的说,hemnes只需要一个查询。使用process_query函数检索给定查询的产品数据。处理查询返回包含与给定查询匹配的产品的列表[产品]。

importhemnes# query ikea's product catalog for products tagged as chairs# chair_results is now a list[Product] containing all of the products# in ikea's catalog of chairsresults=hemnes.process_query('chair')

产品对象详细信息

hemnes以列表[产品]的形式返回查询结果。产品是包含以下字段的帮助程序类:

  • 名称(str)-产品名称
  • id(str)-唯一的产品id
  • 价格(浮动)-产品价格
  • url(str)-产品页面的url
  • 评级(浮动)-平均客户评级
  • img_url(list[str])-产品图像的url
  • 颜色(列表[str])-产品颜色
  • 标记(str)-灵活使用字段

其中大多数都是非常不言而喻的;我只想深入讨论标记字段。标记属性是为一次调用process_query返回的所有产品指定的,并且包含在其中以供灵活使用。为什么这样一个字段会有用的一个例子是,如果您将此数据存储在数据库中,并且需要一个主键来搜索-您可以使用标记来指示产品类型(椅子、桌子等)。默认情况下,标记设置为。有关使用标记的详细信息,请参见设置其他选项

还有一点需要注意的是,除了url之外,所有这些字段都有可能找不到,并随后被设置为none。但是,在测试和检查宜家的产品网页,不太可能找不到这些属性。此规则的一个例外是评分字段,在产品没有评论时,该字段将设置为

高级用法

hemnes需要传递一个选项对象来指定一些附加设置。options是一个帮助类,用于组织将大量参数传递给流程查询。如果您不提供选项对象来处理查询,则会选择许多默认设置。本节的其余部分将讨论如何修改这些设置。

指定chromedriver二进制文件的路径

如果您已经安装了chromedriver二进制文件和google chrome浏览器,但在运行hemnes时仍然遇到错误,则可能需要将二进制文件的路径显式传递给selenium webdriver。为此,请使用选项

importhemnes...# explicitly passing the chromedriver binary to webdriveroptions=hemnes.Options()options.cdriver_path='path/to/chromedriver/binary'results=hemnes.process_query('your query',options)

必需的关键字&;严格搜索

有时,有必要在通常的高级查询术语之外改进查询。hemnes允许您指定要在产品页面上搜索的多个关键字,并且只返回包含全部或部分这些词的产品。选项接受将关键字字段设置为包含所需关键字的集合[str]

您还可以通过将optionsstrict字段设置为bool来指定是否需要所有关键字。默认情况下,strict设置为false,这意味着如果传递了关键字,则将返回任何具有至少一个关键字的产品。要要求为返回的产品找到所有关键字,请将strict设置为true

importhemnes...# setting required keywordsoptions=hemnes.Options()options.keywords={'large','comfortable'}# enable strict-searching, requiring all products to contain all of the# keywords in order to be returned. If disabled or untouched, any# product with at least one of the keywords will be returnedoptions.strict=Trueresults=hemnes.process_query('chair',options)

对于那些对搜索关键字的位置感到好奇的人,hemnes在每个产品页面的3个不同的产品描述部分中搜索关键字

启用日志记录

返回大量结果的查询的某些作业可能需要一段时间才能完成。即使对于较短的作业,查看hemnes在处理查询时的位置也会有帮助。要启用日志记录过程结果,请将选项中的log字段设置为true。默认情况下,log设置为false以避免压倒性的毫无戒心的用户。

importhemnes...# enabling logsoptions=hemnes.Options()options.log=True# enable logging - this will log to both stdout and to a# logfile found at 'hemnes-logs/hemnes-MONTH-DAY-HOUR-MINUTE-SECOND.logresults=hemnes.process_query('chair',options)

默认情况下,日志记录将同时记录到stdout和一个类似于hemnes logs/hemnes-04-23-02:41:16.log的日志文件-该文件名为hemnes month day hour minute second.log。如果没有hemnes日志目录,将在尝试向其写入文件之前创建该目录。

Hemnes会记录如下内容:

  • 找到有效产品时
  • 当发现无效产品时(例如关键字要求失败)
  • 要返回的有效产品总数
  • 任何潜在错误

检索特定数量的结果

如果给定查询只需要特定数量的结果,请设置选项的num_results字段。

importhemnes...# setting a target number of resultsoptions=hemnes.Options()options.num_results=10# hemnes will only return up to 10 productsresults=hemnes.process_query('chair',options)

hemnes将返回请求的产品数量,如果查询没有返回足够的结果,则返回的产品数量将更少。

加速

加载角度页可能很慢,主要是因为从这些页检索完整的dom需要时间。改变dom的睡眠时间以使其完全加载可以显著提高hemnes的速度。

默认情况下,hemnes要求在每个页面请求后有3秒的睡眠时间,以确保dom已完全加载。对于下载速度快的用户,这可能比所需的时间长。为了减少网络请求后的睡眠时间,请将选项的睡眠时间属性设置为更多适合您的互联网连接。

importhemnes...# setting required keywordsoptions=hemnes.Options()options.sleep_time=1# hemnes will now wait only 1 second for DOM to be loaded for# newly retrieved pages. Users should set sleep_time to an# appropriate amount of time based on their internet connection.# The default setting of 3-seconds should be fine for almost all usersresults=hemnes.process_query('chair',options)

使用产品的标记字段

通过在选项中设置标签字段,可以为所有返回的产品设置标签字段。标记的类型应为str

importhemnes...# setting the tag attributeoptions=hemnes.Options()options.tag='chair'# all of the products returned in results will have their tag field# set to the string "chair"results=hemnes.process_query('chair',options)

将结果写入json或csv

通过使用选项设置文件的适当路径,可以将刮取的结果存储到json或csv。 如果路径已存在,hemnes将删除现有文件。

注意:任何none字段都将在json中写为null或在csv中保留为空

pip3 install hemnes
0

测试

测试分为孤立的测试和集成的测试。独立测试听起来是针对单个功能的真正单元测试。test_integrated是对更高级别功能的测试,它依赖于在test_isolated中测试的功能所提供的一些较低级别功能。

注意:test_integrated在从开始到结束检索产品数据的整个过程中,需要一点时间来执行

要运行测试,请克隆存储库并使用pytest运行

pip3 install hemnes
1

接下来是什么

我对现在的情况很满意-如果有人要求更多的功能,我会查看它们,否则我会按原样维护hemnes。

发布历史记录

  • 1.2-将保存添加到csv
  • 1.1-将保存添加到json
  • 1.0-第一个稳定的测试版本
  • 0.*.-预测试版本

许可证

根据麻省理工学院的许可证发行。有关详细信息,请参见许可证。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
文本中的java JFX图像   堆栈快速java问题   Web服务上的java设置超时   找不到java Jersey MessageBodyReader   尝试运行TestNG类时,Eclipse中线程“main”中出现java异常错误   java Wakelock只工作一次   多线程Java同步和线程   java日期解析操作使服务器崩溃   在Bluemix中启动应用程序时,java无法创建PoolableConnectionFactory错误   java包装是否超出了可用空间中组合框的内容?   java安卓游戏时间处理   根据Java,spring是线程安全的方法   正则表达式如何使用java查找中间有空格的数字的正则表达式模式   java使用数组作为自定义通用哈希表中的表来存储条目   java中缀到后缀求值   java类型安全:Map[]类型的表达式需要未经检查的转换才能符合Map<String,Object>[]   java Jama矩阵printwriter错误   java在使用GridLayout创建战舰程序时遇到问题