本文将记录在人工智能自动组方实习中前期有关于网络爬虫的内容,有如果有哪位小伙伴在做相关内容,可以发邮件联系(1318525510@qq.com)与我互相学习
以下为该项目的系列文章
工作记录
萤火虫算法
FCM模糊C聚类
爬虫及python代码
数据预处理
中医分类及python代码
数据预处理python代码
基于字典的最大正向匹配
基于欧式距离的方剂推荐
基于方剂相似性的方剂推荐
GitHub地址
在前期准备工作中,需要得到中医相关的大量数据包括中医药材,药方,疾病,及疾病处理等多个数据集。对于疾病数据库将某本中医书籍上的疾病信息通过人工处理和OCR加工,对于中医药材药方数据集采用网络爬虫从中医相关网站爬取,对于疾病处理数据库采用人工实体标注将每一个疾病打上大类(例如 月经病 带下病 妊娠病)和病机(例如气血两虚 肾阴不足 )两个标签为以后使用,对于药材和药方两个数据库我们采用的是通过网络爬虫爬取相关专业网站并保存。
#网络爬虫的流程:
将HTML文件利用beautifulsoup库转为BS对象方便对HTML标签进行查找,利用re正则化快速找到相同格式的内容,并利用OS,pandas库将其保存。
在本次实习中网络爬虫的具体流程如下:
- 使用selenium中的模拟浏览为登陆网页或者使用urllib库得到HTML文件并且将每一HTML文件保存在TXT文件中。具体代码详见下文
- 将保存的HTML文件进行判断,将不能打开的HTML的文件并保存下来,具体代码详见下文
- 对无法打开的HTML文件重新登录操作并保存HTML,具体代码详见下文
- 将得到都可以打开的HTML文件根据HTML标签和CSS文件抽取信心并保存在csv文件中,具体代码详见下文
下面主要介绍下用到的几个python库文件及参考博文。
#python库
##urllib
在网上爬取内容,首先我们需要得到网址对应的HTML文件,在这里采用的的是urllib库。urllib库几乎可以对HTTP进行所有操作,我们只使用了 u r l l i b . r e q u e s t urllib.request urllib.request请求模块,具体内容我参考的是这2篇博文urllib基本使用方法 、python3中的urllib使用
##bs4
bs4库中的Beautifulsoup将HTML文件解析为BS对象,通过函数更方便对HTML文件进行查找操作,具体内容我参考的是这2篇博文BeautifulSoup简介1、 BeautifulSoup简介2
##re
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
我使用的正则库的相关内容都是参考这个网上这篇博文正则表达式
##selenium
一个非常强大的python自动化测试库
有些时候需模拟浏览器登陆,并且保持cookies值使得操作不掉线,在这里我们使用的是selenium模块,selenium是一个自动化测试工具,支持各种浏览器包括chrome,safari,ie以及 PhantomJS(headless webdriver)等模拟浏览器操作,其中PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Python 的对接,Python 进行后期的处理。
在浏览器上我们选择的是PhantomJS这个无头浏览器,因为在模拟浏览器登陆时使用其他浏览器会自动打开浏览器完成对应的操作,而PhantomJS只是在后台操作并没有显示所有效率很高,使用无头浏览器时需要将PhantomJS的保存位置写进系统环境变量中或者在使用时声明所浏览器所在地址例如
from selenium import webdriver
driver = webdriver.PhantomJS(executable_path="phantomjs.exe")
因为是模拟浏览器操作,selenium模块也可以操作http的所有操作。具体内容我参考的是selenuim用法1 、selenium用法2、 PhantomJS
###利用无头浏览器登录网页并保存HTML文件
登陆网站并保持cookies,将HTML文件保存下来,为下一步提取信息
import time
import re
import random
from selenium import webdriver
#登录获取并保持cookies
def login(username, password):
url = 'https://www.yaozh.com/login'
# browser = webdriver.PhantomJS()
browser = webdriver.Firefox()
browser.get(url)
# print driver.title
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)
# time.sleep(0.2)
browser.get('https://db.yaozh.com/')
browser.get('https://db.yaozh.com/zhongyaocai')
print('登录成功')
# print(browser)
return browser
#爬取页面
def spider(browser,url,page):
t = page
for i in range(t, 10027500):
while True:
# time.sleep(1)
try:
browser.get(url + str(i)+'.html')
except:
return page
if ('<title>跳转提示</title>' in browser.page_source) or('暂无权限' in browser.page_source) or('<body οnlοad="challenge();">' in browser.page_source):
print("错误!")
continue
f = open('data/fangjipage1/'+str(i)+'.txt','a',encoding='utf-8')
f.write(browser.page_source)
print(i)
f.close()
break
page += 1
if __name__ == "__main__":
global page
page = 1002400
user = "zhaoliang