个人理解的Python爬虫流程(通俗版--案例NASDAQ)
目录:
1. 准备阶段:python安装,相关packages安装。
2. 先拿一个目标做测试、编程研究。
3. 组装整体框架。
4. 结果输出。
5. 优化"算法"。
*6. 应对“反爬虫”技术。
1. 准备阶段:python安装,相关packages安装。
(1) python安装:Python安装大部分帖子都有涉及到,但是选择好的语言环境更方便于日后的工作。个人更加喜欢Anaconda。主流的IDE有PyCharm, VScode, Jupyter等,笔者用的是Jupyter和VScode, 感觉Jupyter做测试、实验,vscode来做project。
(2) packages:一般来讲需要的packages有: urllib3, BeautifulSoup, selenium等,如果需要加工results,可能会需要Pandas, Numpy等。如果需要解析特殊的WEB 可能会用到json,cookiejar等,具体问题具体分析。
A. 如果你是用anaconda, 安装packages很方便,在environment里右上交搜索相应的packgae,应用安装即可。(如图1-1)
图1-1:
之后在jupyter中引用的时候,直接import即可(如图1-2):
图1-2:
B. 如果你是选择vs code,需要用pip install命令,但是先要调配好pip。如果是linux系统,就更加方便了,笔者是linux系统+vscode, 直接用conda 语言环境,activate即可。
2. 先拿一个目标做测试、编程研究.
写一整个爬虫程序会很复杂,所以要事先明确目标。每个web的框架,编写逻辑都不一样,甚至同时需要翻到很多个href去运行。所以我会习惯先拿一个目标做做样子~
下面以NASDAQ的web为例,我们来看如何预先“做样子”:
图2-1:
见图2-1,我们想要摘取这家公司的所有相关信息,比如CIK,share price, symbol, 地址,电话等,这些就是尝试。最后我们可能要爬去成百上千家公司的同样信息,每家公司的web框架一样,那么只要做出一家基本上就可以以此类推。
第一步,我们要做的就是将这个web转化成机器可以读懂的代码形式,我们需要运用urllib和beautifulsoup。(如图2-2)基本思路是定义url地址,发出request,打开网页,解码,beautifulsoup,最后print。
图2-2:
图2-3:
看一下这个网站的代码,还是很规矩的(后面我们会降到不规则的web代码),每一个span, td 对应每一层,爬虫的根本方法在于,定位你所需要的内容,然后获取信息。get_text(). 所以我们在应用爬虫之前,最好懂得一些html, javascript, css,vue.js, json等基础的前端语言,SQL PHP等服务端语言可能用到的不多。
接着刚才的讲,(a)因为我们要抓取很多个web,所以输出时候最好建一个list来存储,尤其在def的时候尤为重要。(b)如果抓取的信息不规矩,我们还要通过正则来清洗。如图2-4。
图2-4:
3. 组装整体框架。
现在我们开始做整体考虑,我们的目标是要抓取2010年到2018年所有上市公司的信息,那么需要get到很多的href.
图3-1:
这个网址为https://www.nasdaq.com/markets/ipos/activity.aspx?tab=pricings&month=2018-12,如图3-1, 我们要获取每一个公司的信息。我们发现有几个特点,(a) url末尾2018-12标明的是IPO日期,那么我们想要获取2010年到2018年的IPO信息,只要创建一个日期自动变换的list即可。(b) 找到如何跳转网页的方法。
图3-2:
我们创建好日期更换的list,直接引用到def就可以了。那么,如何找到网页跳转的方法呢。看图3-3,我们发现每一个??都是跳转到你所点击的公司信息网址,那么我们只要get到那个网址就可以。具体代码参考图3-4。
图3-3:
图3-4:
最后还是建议多运用class和def,我最开始特别不习惯运用def 和class,后来发现,不得不用的时候,才会觉得面向对象的编程,会让思路逻辑更清晰。(图3-5)还有可以适当存档之前的输出结果,运用dic字典也可以更加方便。记住在loop里,脚本语言默认输出最后一个值,要想输出整体list,还是要选择合适的return。
图3-5:
4. 结果输出。
笔者最后选择输出csv格式,但是很多人也可以直接在python里运用numpy, pandas去做运算加工。也可以链接数据库,具体才考大神的笔录。读取/存储csv有几个常用方法,如图4-1:
图4-1:
读取:
存储:
利用pandas:
5. 清理数据,优化"算法"。
清理数据,优化算法很重要,往往更精准,更省时间。笔者一开始写的要花费要几个小时去run,尽量减少Loop和不必要的定义就好。其次要选择机器计算最省事的方法。图5-1:消除index error, value error, 去掉空值,去掉没用的符号和空字符串,不会导致自己白等那么多时间结果出现error,笔者之前很懒,不愿意去考虑这些,总会导致重复工作。
图5-1:
优化算法这点,我很垃圾,以前听过大神讲,我写的东西废话太多,所以我理解吧,少说些废话,尽量一步到位,当然有些必要的还是要保留。举个例子,比如说我们找出2到1,000,000所有的质数。我要写就会从2开始试,能被1和自身整除就存在List里。但是这样机器就像小孩子一样一直来回来去数数。
*6. 应对“反爬虫”技术。
现在很多web会发爬虫,常见的方法比如检测你访问频率,然后拉黑你的ip,这个时候我们要找很多IP Proxy然后randomly的选则使用,如图*6-1,这些可以查找免费的。
图*6-1:
然后我们最好加header,模拟浏览器访问。如图*6-2。
然后有一些比如手动滑验证码的,可以考虑实用selenium模拟movement。有些网站会自动替换字符串,比如你看到1438可能你转换成代码就变成1348,那么我们需要从新定义字符串。有些可能会需要图片解析,因为你看到的数字可能是图片,解析图片可能需要PIL。有些会获取返还你的一个时间段cookie,那么记得清除。哦对了。。。记得设time.sleep() 不然太高频率会被疑似DOS攻击,笔者之前就因此被拉黑过.....
感言:
路漫漫其"修"远兮,有些东西还是在实践中不断学习,那些专门做这个工作的人真的懂的太多,欢迎大神指正错误,互相学习,一起进步!!