Python网路数据采集(爬虫)
优采云 发布时间: 2020-08-14 00:05原书链接: 密码:9uy1
写代码之前拟个大纲或画个流程图是挺好的编程习惯,这么做除了可以为你后期处理节约 很多时间,更重要的是可以避免自己在爬虫显得越来越复杂时乱了分寸。(自己当产品总监)
添加处理异常会使代码更好体验,在写爬虫的时侯,思考代码的总体格局,让代码既可以捕捉异常又容易阅读,这是很重要 的。如果你还希望还能很大程度地重用代码,那么拥有象 getSiteHTML 和 getTitle 这样的 通用函数(具有缜密的异常处理功能)会使快速稳定地网路数据采集变得简单易行。
豆瓣目录
如果你想入门爬虫,推荐这本书,此书使用的是Py3.
第一,二章直接推荐你们使用BeautifulSoup来解析网页,个人认为最好用的还是lxml,但是本书并没有谈到。BS的使用分为三个步骤,创建,搜索,访问。直接引用标签只会返回第一个匹配的element,你若果想要返回多个这么就要使用find_all,如果限制访问个数择则有一个limit属性,如果访问标签不存在则会返回None,但是假如继续访问这个不存在标签的属性,则会返回Error,所以使用要注意。其他的使用还有好多,例如Navigating Trees,BS最最强悍的在于它支持ReEx,还有好多小的细节,访问节点的三种形式,匿名函数,最后也推荐了lxml。个人提示,当你的笔记本装了lxml以后,在使用Bs创建对象的时侯,加上html的解析器属性--html.parser
第三章,爬虫的基础,算是上面讲解的实战。
第四章,使用API爬取信息,可以省略大部分,后面关于JSON的解析有必要注意一下,loads,jumps直接对于Json格式和字典的转换。
第五章,存储数据,介绍了CSV(comma-separated values),以及MySQL,MySQL的使用可以专门去学习,而且很重要。Py2中是用MySQLdb库来操作数据库,在Py3中则换用PyMySQL,最后则是讲解了使用smtplib来发送Email,因人而异的功能。
第六章,文本的操作,手先讲解了编码的处理,decode > unicode > encode,utf8只是unicode的编码实现方法。首先是怎样处理CSV文件(CSV),然后PDF(pdfminer)及docx(zipfile)
第七章,高阶爬虫的方法,也是我看本书的最终目的。本章注重讲解数据的清洗,使用正则,或者repalce一下,其实python的numpy或则pandas在这方面早已太优秀。同时本书介绍了专门的软件按OpenRefine.
第八章,马尔可夫模型生成伪随机文本,还介绍了NLTK工具包,这个英语支持良好,中文不了解。
第九章,模拟登陆,使用强悍的requests。保持登入使用session来访问,最后稍稍讲解了Auth。
第十章,Js解析,使用selenium和PhantomJS来解析网页,通过调用API来实现一些操作,最后处理了客户端Js重定向问题,服务器端不用害怕,因为Python的外置库文件手动执行
第十一章,图像辨识,反爬虫机制的发展是不断上升的过程。在CAPTCHAs可以使用PIL简单辨识,或者使用Tesseract来模拟训练,图像辨识或则说OCR本身就是很大的方向,可忽视
第十二章,避免爬虫圈套,介绍一些坑人的页面反爬虫机制及处理方法
第十三章,测试方法,使用unittest或selenium测试
第十四章,IP限制使用Tor,但是国外被墙制做了解,及使用Google或则AWS的云服务
下面须要看一下算法或则深入机器学习的书籍,数据的获取和处理,我想作为一个数学系的中学生,重点是怎样Learning,如何去特点提取,Python的编程只是加分项,我也只把Python作为惟一的编程工具,源码须要学习。
第一部分创建爬虫
采集信息用的程序通常被称为网络爬虫(Web crawler)、网络铲(Web scraper,可类比考古用的洛阳铲)、网络蜘蛛(Webspider),其行为通常是先“爬”到对应的网页上,再把须要的信息“铲”下来。网络数据采集程序也象是一只辛劳采蜜的小蜜蜂,它飞到花(目标网页)上,采集花粉(需要的信息),经过处理(数据清洗、存储)变成牛奶(可用的数据)。
思考“网络爬虫”时一般的看法:(就是自己写api)
通过网站域名获取HTML 数据
根据目标信息解析数据
存储目标信息
如果有必要,移动到另一个网页重复这个过程
用虚拟环境保存库文件
如果同时负责多个 Python 项目,或者想要轻松打包某个项目及其关联的库文件,再 或者你害怕已安装的库之间可能有冲突,那么你可以安装一个 Python 虚拟环境来分而 治之。(大事化小)
将项目关联的所有库单独置于一个虚拟环境里,还可以轻松打包整个环境发生给其他 人。只要她们的 Python 版本和你的相同,你打包的代码就可以直接通过虚拟环境运 行,不需要再安装任何库。
urlopen 用来打开并读取一个从网路获取的远程对象。因为它是一个十分通用的库(它可以轻松读取 HTML 文件、图像文件,或其他任何文件流)。
异常测量:
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import sys
def getTitle(url):
try:
html = urlopen(url)
except HTTPError as e:
print(e)
return None
try:
bsObj = BeautifulSoup(html.read())
title = bsObj.body.h1
except AttributeError as e:
return None
return title
title = getTitle("http://www.pythonscraping.com/exercises/exercise1.html")
if title == None:
print("Title could not be found")
else:
print(title)
这个事例中,我们创建了一个getTitle 函数,可以返回网页的标题,如果获取网页的时侯碰到问题就返回一个None 对象。在getTitle 函数上面,我们象上面那样检测了HTTPError,然后把两行BeautifulSoup 代码封装在一个try 语句上面。这两行中的任何一行有问题,AttributeError 都可能被抛出(如果服务器不存在,html 就是一个None 对象,html.read() 就会抛出AttributeError)。其实,我们可以在try 语句上面放任意多行代码,或者放一个在任意位置都可以抛出AttributeError 的函数。
复杂HTML解析
在面对潜藏太深或格式不友好的数据时,千万不要不经思索就写代码,一定要三思 而后行。(手机端、、、)
BeautifulSoup强悍过滤能力 假如你正在处理一个收录许多超链接、段落和标签的大段源代码,那么.get_text() 会把这种超链接、段落和标签都去除掉,只剩下一串不带标签的文字。通常在你打算复印、存储和操作数据时,应该最后才使用.get_text()。一般情况下,你应当尽可能地保留HTML 文档的标签结构。数组转为对象
.findAll({"h1","h2","h3","h4","h5","h6"})
.findAll("span", {"class":{"green", "red"}})
nameList = bsObj.findAll("span", {"class":"green"})
下面两行代码是完全一样的:
bsObj.findAll(id="text")
bsObj.findAll("", {"id":"text"})
返回的列表
选择器强悍,类似css选择器,兄弟,后代(导航树)
正则: