您的位置:首页 > 其它

项目进度汇报5

2017-08-08 17:05 148 查看

项目汇报——第五部分

趁着我的小爬虫在辛勤工作,先来写一下这几天的工作。
首先,怀揣着对数据来源可靠性的极度不放心,我放下了机器学习那边的工作,想着先爬到数据,用用决策树啥啥啥的简单方法试一试数据能不能用……
说实在的,爬网页的时候真是坎坷。

首先,锁定目标网站。在这里我选择了39健康网http://jbk.39.net/(没有打广告)。先来分析一下网页的 sources,由于需要的数据是疾病和症状的对应关系,直接跳到“疾病症状”板块:万能的F12登场



其实当看到这个网页的源码的时候,是有一点点感动的,写的太工整了,为他们的工程师点赞!
分析一下页面,发现要找的东西已经比较规整了:



于是转到elements里面寻找对应的元素。哇的一声又被感动了,



不要太工整!!!
然后很顺利的就找到了疾病和相关症状的网页链接所在地:
每一个<div></div>就是一个标签,然后用正则表达式就能取得关键信息:疾病和对应的相关症状的链接。
再用相应的链接爬取相应的症状,搞定!
现在来看看相应症状是个啥情况



已经很明显的列出来啦哈哈哈哈,看一下Elements:



嗯,看到这里就可以开始愉快的写爬虫了。

我打算使用网页cookie来起到一点抵抗反爬虫的作用。定义一个cookieJar,使用这个cookieJar实例来构建一个opener
cookies = cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookies))
接着构造一个request,使用刚刚的opener请求访问,返回结果使用通常的utf-8解码,保存为str之后,使用正则表达式:
request = urllib.request.Request(url = Url)

patternForPageF = re.compile(r'病因.*?href="(.*?)/">相关症状.*?class="jzzn-link">查看(.*?)就诊指南>>',re.S)

然后把结果写入文本试试
findResult = re.findall(patternForPageF,hhhh)
ItemsForDisease.append(findResult)
for it in findResult:
f.write(it[1]+'\n')
f.write(it[0]+'\n')
哇!首战失利!直接no response!
抱着侥幸的心理,试着在request里添加一个header?
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"}
request = urllib.request.Request(url = Url,headers = headers)
嗯嗯嗯,搞定!访问成功。
然而,爬虫并没有解析出结果,而是报了错。说啥啥啥无法解析



什么!通用的utf-8不能用了?
算了,换成gbk试试,毕竟中国的网页,唉。
搞定!解码成功并且正确打印了疾病和相关症状的链接
再用opener打开症状链接,正则表达式变为
pattern = re.compile(r'<a title="(.*?)" href="http://jbk',re.S)



结果上面这样。
哇哇哇,那还等什么!赶紧写个loop循环起来再说,一共打算爬1500份页面,每隔5秒爬一页(防止访问过于频繁)
然后我就去睡觉了
起来的时候,爬虫停在了一百零一页,报错了。
再一看……WTF,gbk解码也报错了?报错也就算了,由于没有捕获异常,之前爬的都没有保存下来……瞬间心累





于是,代码变成了这样:
try:
hhhh = str(result.read().decode('gbk','replace'))
except UnicodeDecodeError as e:
print(e.reason)
print('UnicodeDecodeError')
else:
patternForPageF = re.compile(r'病因.*?href="(.*?)/">相关症状.*?class="jzzn-link">查看(.*?)就诊指南>>',re.S)
findResult = re.findall(patternForPageF,hhhh) ItemsForDisease.append(findResult) for it in findResult: f.write(it[1]+'\n') f.write(it[0]+'\n')
这下好了吧???
还是不行,到了两百多页的时候,出现了request超时的错误……
唉,没办法,设置一下timeout,再捕获异常
try:
result = opener.open(request,timeout=100000)
print('打开成功,尝试解码')
except error.HTTPError as e:
print(e.reason)
except error.URLError as e:
print(e.reason)
else:
try:..............
然后,我的小爬虫现在还在爬着……期间已经很多次抛出并处理了异常,暗暗庆幸。



除了爬到了数据,我多多少少还是看了一些ML的
比如看了决策树和贝叶斯分类
码的代码就不贴了
下一步尝试用爬到的数据,简单的试一试能不能用。

/* created by ColonyAlbert 17.8.8
 *WORK HARD IN SILENCE
 *LET SUCCESS BE YOUR NOISE
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: