引言
首先声明,笔者所说的0基础并非编程0基础,而是系统学习过c++程序设计,编程水平中等偏上。只是对Python的语法、HTML的架构、网络通信的HTTP协议一无所知。
学习Python的背景是小老板让我查找近五年相关领域申请通过的全部自然基金,并做成excel表给他。大概查了一下,上千条信息,海量的工作量,于是萌生了用Python爬一下的构想,顺便解锁新技能。
从萌生想法到爬取成功历时4天,为了方便大家阅读,我把内容分为三章,分别是软件安装,初窥门槛,源码解析。
(一)软件安装:包含了Python和Pycharm下载安装过程中踩的坑、cmd命令及虚拟环境安装设置。Python解释器和lxml库版本不匹配,及lxml库中etree模块缺失导致的attribution报错消耗了我两天时间,这期间一条代码都没跑通,差点被劝退。从0到0,历时两天。
(二)初窥门槛:记录我完成版本匹配后,学习谷歌Web Scraper插件并被劝退,逐渐跑通Python代码,学会获取url,成功识别网站“乱码”,完成程序架构设计的全过程。至此我确定了凭自己的能力可以用Python完成既定目标,不用手自笔录从网站复制数据。剩下的拼图还有三块:学习正则表达式、数据写入列表、数据导出excel。从0到0.001,历时一天。
(三)源码解析:完成程序架构设计后,我花大半天学习了正则表达式,再用一天的小尾巴完成了从html用正则表达式筛选数据、动态翻页、数据写入列表、数据导出excel等功能。从0.001到1,历时一天。
废话不多说,让我们开始吧。
任务描述
获取2015-2020年通过申请的国家科学自然基金中,E.工程与材料科学部下,E03.有机高分子材料及E05.机械设计与制造,这两子类的全部项目关键信息,并制为excel表。
经过广泛搜索,最终确定网站http://www.izaiwen.cn/
为爬取对象,网站首页如下图所示。
软件安装的第一次尝试
- 参考大佬“你缺少想象力”的Python教程,知道了下载完Python还要下PyCharm。
博客地址https://blog.csdn.net/IT_XF/article/details/82184585
从公众号“软件智库”上下载了Python 3.9.0;
从网站https://dl.pconline.com.cn/download/512187.html
下载了Pycharm 2019.3.3版。 - 学习使用cmd命令
(1)打开cmd并进入指定文件夹,参考教程:
https://jingyan.baidu.com/article/3aed632ec1472070108091e1.html
(2)利用cmd中pip指令安装requests,lxml等库,参考教程:
https://www.cnblogs.com/chenting123456789/p/11840740.html
- 版本不匹配及属性缺失
运行大佬“你缺少想象力”的源程序时,发现PyCharm报错,百度得知,原因是高版本lxml中移除了etree模块,源程序如下。
import requests
from lxml import etree
html = requests.get("https://blog.csdn.net/it_xf?viewmode=contents")
# print html.text
etree_html = etree.HTML(html.text)
content = etree_html.xpath('//*[@id="mainBox"]/main/div[2]/div[1]/h4/a/text()')
for each in content:
print(each)
Python解释器及lxml版本不匹配的解决方法
不同版本Python应适配不同版本lxml,为解决不同版本Python解释器在同一台机器上的兼容并存,常采用安装虚拟环境的方法,详见教程:
https://blog.csdn.net/godot06/article/details/81079064
https://www.cnblogs.com/dcpeng/p/12257331.html
按上述教程,在安装Python 3.9.0后安装Python 3.7.0,用cmd命令反复尝试安装虚拟环境。或因环境变量问题,始终无法解决冲突,最后通过geek卸载了Python和Pycharm,并删除残余文件夹及环境变量,重启后重装Python 3.7.0及Pycharm 2019.3.3。
重装后按上述教程下载库、运行Python程序,不再出现版本不匹配及lxml库不含etree模块的报错。
高版本lxml库不含etree模块的解决方法
在未重装Python和Pycharm前,尝试通过from lxml import html
的方法导入etree,依旧失败;重装后问题迎刃而解。源程序如下:
from lxml import html
text=```xxx```//测试的html文本
etree = html.etree
htmlDiv = etree.HTML(text)
title = htmlDiv.xpath("//meta[1]/@content")
print(title)
解决方法参见教程:
https://blog.csdn.net/klordy_123/article/details/82949757
小结
只有在重装软件后才解决了卡了我两天的版本不匹配和冲突问题,同时我换了个思路,不再纠结于一人的教程,而是广撒网,疯狂搜索0基础Python爬虫教程,终于获取了几个宝贵的,能在我当前版本软件跑通的源代码。
正是因为改变了思路,我才能站在巨人的肩膀上学习语法和编程思路,快速完成工作。