爬取药智网方剂数据

    最近项目因为缺少数据,需要在网上找些数据来做demo,然后找到了药智网的数据看起来还比较规整,于是选择对它下手~

    实际上这个网站也没有什么高超的反爬手段,对于我这种爬虫新手还是可以应付的。

    之前都是使用python爬很简单的静态网页,药智需要登陆才能访问方剂的详细数据,在网上学了学使用urllib或者requests库来保持session和cookies从而能保持登陆状态爬取数据,后来发现selenium这个库也蛮好用的。

    简单介绍下Selenium:Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建衰退测试检验软件功能和用户需求。支持自动录制动作和自动生成。Net、Java、Perl等不同语言的测试脚本。Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。

    当然Selenium也支持python,它可以用来测试Web程序,也可以用来爬取网页,最大的优点是它可以模仿浏览器完成你想要完成的操作,可以省去自己去构造复杂的Ajax参数,非常方便。

    我使用了火狐,在使用前要下载浏览器对应的驱动,使用火狐浏览器请下载geckodriver,将其放在火狐文件夹下,并将火狐的根目录路径添加到系统环境变量中。

    首先创建browser,使用该浏览器对象进行一系列访问操作。

browser = webdriver.Firefox()
browser.get(url)
name_input = browser.find_element_by_id('username')  # 找到用户名的框框
pass_input = browser.find_element_by_id('pwd')  # 找到输入密码的框框
login_button = browser.find_element_by_id('button')  # 找到登录按钮
name_input.clear()
name_input.send_keys(username)  # 填写用户名
time.sleep(0.2)                 
pass_input.clear()
pass_input.send_keys(password)  # 填写密码
time.sleep(0.2)
login_button.click()            # 点击登录
time.sleep(1)
browser.get('https://db.yaozh.com/')
browser.get('https://db.yaozh.com/zhongyaocai')

   我们可以使用browser.find_element_by_XX()方法来找到网页中的元素,并对其进行模拟操作,如click,使用browser.get(url)来进行跳转页面,这样可以省去在不同页面设置不同cookies的繁琐操作。

    如果不想看到Selenium打开一个浏览器,可以使用PhantomJS来代替Firefox,PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器,提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如网络监测、网页截屏、无需浏览器的 Web 测试、页面访问自动化等。在使用前,同样需要把PhantomJS的路径添加到环境变量中。

browser = webdriver.PhantomJS()

    经过以上操作我们就可以保持登陆状态来爬取数据了,方剂数据有3万+个页面,频繁地爬取难免会被服务器拒绝或者是爬到无效地页面,所以在进一步爬取页面中地数据前先判断页面是否无效,比如判断‘404-药智数据库’,’暂无权限‘这些无效页面地特征字符串是否出现在页面中。若被服务器拒绝访问,则获取新的browser对象重新进行登陆,此外对于这样地小型网站,爬取速度不要太快,不要给服务器太大压力,这样也不需要花费多少力气就能得到网页数据。

    爬到网页后,可以使用正则表达式来提取自己想要的信息,或者使用Beautifulsoup这种类型的解析包,很方便就能找到想要得到的网页元素。

   例如,得到所有th元素:

 bs = BeautifulSoup(html)
 thresult = bs.find_all('th')

    接着可以使用.get_text()方法访问元素内的文本。爬到方剂的各个属性数据后,将其规整为一个字典,将该字典改为pandas.Series格式,依次插入pandas.Dataframe中,最终将数据导出成csv文件。

data = pd.Series(d)
df = df.append(data,ignore_index=True)
df.to_csv('data/fangji.csv')


猜你喜欢

转载自blog.csdn.net/weixin_39837402/article/details/79943719