药的价格是固定的吗?用Python分析了上千家药房!远离被宰!

在对比医院业务数据中的各类药品价格的时候,面对着成千上百种的药品。因而想到使用爬虫来自动获取网上的药品价格,保存下来导入数据库中就可以方便地比较院方的药品采购价格了。

通过百度搜索“药品价格查询”,在众多的网站中,这里选择了药价查询网(http://www.china-yao.com/),主要是因为这个网站不需要用户注册就可以查询药品价格,另外查询结果显示界面比较简洁,编写爬虫较为省心。

随便在该站点搜索药品“氟氯西林钠阿莫西林胶囊”,查看生成结果页面的源代码(如下):

从代码的第一行可以看出该站使用的是PHP,url为“http://www.china-yao.com/?act=search&typeid=1&keyword=%E6%B0%9F%E6%B0%AF%E8%A5%BF%E6%9E%97%E9%92%A0%E9%98%BF%E8%8E%AB%E8%A5%BF%E6%9E%97%E8%83%B6%E5%9B%8A”,其中“keyword=”后跟的是“氟氯西林钠阿莫西林胶囊”的utf8编码格式,该药品的价格信息比较多,总共有3页,点开第三页后,此时url变为“http://www.china-yao.com/?act=search&typeid=1&keyword=%E6%B0%9F%E6%B0%AF%E8%A5%BF%E6%9E%97%E9%92%A0%E9%98%BF%E8%8E%AB%E8%A5%BF%E6%9E%97%E8%83%B6%E5%9B%8A&page=3”,就是在原url地址的基础上增加了“&page=3”,其中数字3表示第三页。而页码数存在于代码之间。很显然,我们只需要把url中“keyword=”和“&page=”后面的信息替换掉就可以组合(

······

)出带有我们需要信息的页面的url。之后把生成的url进行utf8编码后发送给网站,生成带有查询结果的页面,筛选出( ······ )之间的信息进行保存。

好了,了解到这些之后,下面我们就开始写代码了。

一、使用到的软件工具

Python 2.7

Eclipse

二、导入需要用到的模板

其中myLog是一个自定义模板,其实就是对logging模板的简单格式化,代码如下:

三、简单构建好框架,写出需要用到的主要函数和方法,代码如下:

Item包含了网站查询结果中所含的元素,方便到时候用来提取数据。GetInfor为爬虫主程序。getmedicallist用来从文本“name.txt”中提取需要查询的药品名称(该文件是先从医院数据库中导出的医院所涉及到的药品名称),返回含有药品名称的列表。spider用于在网上爬取药品价格信息,将所有信息保存到列表items中,并返回。pipelines_xls和pipelines_csv分别用于将保存下来的数据保存到xls和csv格式的文件中。getresponsecontent从spider中分离出来主要是为了方便后期的扩展。

四、添加SPIDER的代码

我们使用方法getmedicallist获取到所有需要查询的药品名称后,在这里通过变量names来读取,如下:

加“&page=n”的情况下,只返回查询结果第一页的信息。但查询结果总共有多少页?我们需要先提取出这个最大页数。

在页面代码

这一段之中,有我们需要的页码值,而我们只需要最后一页,也就是最大值。

从运行结果来看,效果还算满意,通过tagul.find_all('a')得到的列表最后一条基本都是结果页面最后一页的页码。但如果结果页面过多的时候,可以看到最后一页的页码不在列表的最后,而是处于列表的倒数第二行。修改增加如下代码,利用try来让程序自动选择提取最后一行还是倒数第二行。

获取到最后一页查询结果的页码值后,我们就可以组合出完整的url地址了。遍历所有的url组合,提取出tbody之间的药品价格信息。方法spider的完整代码如下:

五、保存收集到的数据

添加方法pipelinespipelines_xls和pipelines_csv的代码

至此,全部完成了,点击“运行”。

这里保存的是.csv格式,需要.xls格式的,只需要在__init__中把调用的方法pipelines_csv换成pipelines_xls即可。

当然目前还存在很多不足,

数据量过大的时候,单线程处理速度过慢。

方法getresponsecontent读取页面错误的情况下,没有进一步的处理。

没有使用代理,只是简单的利用time的sleep函数进行简单的防拦截。

上述问题将在随后进行解决。

当然,有什么不当之处,欢迎大家批评指点~

喜欢记得来一个

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180410A15VWP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券