Python网络数据采集笔记(备忘)
第一部分
第一章 第二章
1.urllib2是Python2.x的标准库,Python3.x改为urllib
urllib子模块:urllib.request, urllib.parse, urllib.error
2 .安装BeautifulSoup(第三方), while(urllib是python的标准库)
用虚拟环境保存库文件:virtualenv abcEnv
对于MAC: sudo easy_install pip安装pipe包工具
总结下:pip是easy_install的升级版工具,常用的pip命令:
1) 安装一个包
$ pip install <package_name>
$ pip install <package_name>==<version>
2) 升级一个包 (如果不提供version号,升级到最新版本)
$ pip install --upgrade <package_name>>=<version>
3)删除一个包
$ pip uninstall <package_name>
3.BeautifulSoup的四个对象:
BeautifulSoup对象
Tag对象:BS对象的findAll,find方法返回的
NavigableString对象:标签里的文字
Comment对象:标签里的注释
注,常用方法:
find,findAll
get_text():取出标签
tag.attrs()
4.导航树:
bsObj.tag.subTag.anotherSubTag
for child in bsObj.find().children:
bsObj.find().tr.next_siblings
5.正则表达式用来匹配标签
第三章 采集整个网站
1.链接提取:如何自动获得目标链接,区别内链外链,跳转
getLinks,
去重pages = set(),
not in pages, pages.add()
可以递归实现
递归获取:Python默认递归次数是1000
2.scrapy ——支持2.7
开启项目 scrapy startproject xxSpider
增加xxSpider.py文件
在items.py中增加xx类
第五章 存储
1.存储url
2.存储到CSV
python内置有csv,json库
3.存储到数据库
python开源库:PyMySQL
心得:存储到文件还是数据库怎么定?1是结构化可以减少存储,2是考虑后续处理逻辑的便利性
浏览器90年出现,HTML92年出现。在HTML出现之前,互联网就是收发邮件+传输文件
前五章基本是处理HTML元素,但是还应该包括其他元素,如文本、音频、视频等
第六章 读取文档
1.编码类型:
20世纪60年代有的ASCII编码,采用7位编码,128个字符。
90年代开始有Unicode编码,UTF-8。最少8位,不定长,最多32位。但是世纪最多是21位有效。Unicode兼容ASCII编码,第一位是0的话,就代表是ASCII字符。
2.纯文本
textPage = urlopen(“http://www.cozyou.com”)
print(textPage.read())
print(str(textPage.read(),’utf-8’))
利用BeatifulSoup:
html = urlopen()
bsObj = BeautifulSoup(html)
content = bsObj.find(“div”,{“id”:”xxx"}).get_text()
content = bytes(content, “UTF-8”)
content = content.decode(“UTF-8”)
3.CSV
from io import StringIO
import csv
data = urlopen(“”).read().decode(‘ascii’,’ignore’)
dataFile = StringIO(data)
csvReader = csv.reader(dataFile)
for row in csvReader:
print(row)
4.PDF
5.DOCX
再次重复:
一个HTTP消息包括两部分:
头字段+数据字段
头字段的每项由一对标题和值构成。这些标题是HTTP标准预先定义的。
robots.txt文件是在1994年出现的。
第二部分
第七章 数据清洗
语言学的n-gram
Python的collection里有一个OrderdDict排序字典
第八章 自然语言处理
1.概括数据
概括大义:从n-gram的词频排序中,从公用语法API中提供的最常用的词组,剃出掉
再剩下的n-gram中,找出第一个包含n-gram的句子
居然得到差不多的大义~~
2.马尔科夫模型
好吧,我承认学随机过程用它计算下雨概率的时候,完全没想过能用在这里,好吧牛顿最牛高斯最高的夏树(涛)老师,我对不起你啊
**Google的page rank算法也是基于马尔科夫模型
在文本分析与写作中:
对一个文本中的每个单词建立词典:
{word_a:{word_b:2,word_c:1,word_d:1}
word_b:{word_b:5, word_d:2}
...
}
可以利用马尔科夫找出下一个词即下一跳最可能的方向,连成一句话
当然可以先做一些清洗工作:去掉标点符号
在计算机科学中,无向图问题相比有向图问题不太常见。。。
有向图的最短路径问题,效果最好且常用的是BFS
3.自然语言工具包
NLTK是一个自然语言工具PYTHON库,2000年创建
统计分析、词性分析
第九章 穿越网页表单与登录窗口进行采集
其实这张就是介绍Requests库
1.Requests库,处理复杂的HTTP请求,cookie,header等内容的Python第三方库
2.提交表单
import requests
params = {‘first name’:’Ryan’, ‘last name’:’Mitchell’}
r= requests.post(url,data=params)
print(r.text)
3.单选、复选
4.提交文件和图像
files = {‘uploadFile’ : open(path,’rb’)}
r = requests.post(url, files = files)
print(r.text)
5.处理cookies
r = request.post(url,params)
r= request.get(url,cookies = r.cookies)
session可以跟踪回话信息,比如cookie, header等
session = requests.Session()
s =session.post(url,params)
s = session.get(url)
HTTP Basic access authentication:
auth = HTTPBassicAuth(‘ryan’, ‘password’)
r = requests.post(url,auth)
第10章 采集JavaScript
这张其实就是介绍Selenium,因为这个库可以执行JavaScript,是网络数据采集工具
Selenium自己不带浏览器,作者引入PhantomJS工具代替真实的浏览器。
PhantomJS不是Python库,是一个功能完善的无头浏览器,会把网站加载到内存并执行页面上的JS。但是不展示图形界面,所以叫无头浏览器
让Selenium不断地检查某个元素是否存在,,以此确定页面是否已经完全加载,如果加载成功就执行后面的程序
driver = web driver.PhantomJS(executable_path=‘')
driver.get(url)
try:
element = WebDriverWait(driver,10).until(EC.presence_of_element_located(By.id,”loadedButton”))
finally:
driver.close()
———Selenium的隐式等待,
EC为expected_conditions,即触发期望条件:
比如弹出一个提示框,一个元素被选中,页面标题改变,一个元素在DOM中变为可见或者消失
第11章 图像识别与文字处理
这一章主要讲如何识别包含文字的图片二维码
验证码:CAPTCHA
光学文字识别:OCR: Optical Character Recognition
1.OCR库介绍:
Pillow是Python2.x的Python图形库中分出来的
2.Tesseract:google赞助的开源OCR库
Tesseract是一个Python命令行工具,不是通过import语句导入,而是在Python外面运行
通常用subprocess.call调用:
from PIL import Image
import subprocess
//通过PIL打开图片并通过阈值过滤背景色,存入新文件
image = Image.open(filePath)
image = image.point(lambda x:0 if x<143 else 255)
image.save(newFilePath)
//将newFilePath用tessercat识别,并将结果存放到output.txt中
subprocess.call([“tesseract”, newFilePath, “output”])
outputFile = open(“output.txt”, ‘r’)
print(outputFile.read())
outputFile.close()
3.读取验证码与训练Tesseract
图灵测试:1950年图灵发表的论文:一个人通过计算机终端和人工智能程序交流。如果这个人无法区分对方是人还是人工智能程序,那么就说这个人工智能程序通过了图灵测试。
如何训练Tesseract呢?
识别目标:字母加数字:大小不同,倾斜度不同,粗线条中有空隙等情况
A.建立100各样本,假设每个样本包含5个字符,平均每个字符8个样本,应该足够了
B.准确第告诉Tesseract一张图片中的每个字符是什么,以及每个字符的具体位置。这里需要创建一些矩形定位文件box file,一个验证码图片生成一个矩形定位文件。
每个文件包括5行,每行代表一个字母,每行6列,第1列代表实际数字,接下来四列是包围这个字符的最小矩形的坐标,最后一列代表图片样本编号
注:1和2中的文件命名分别为验证码的实际结果.jpg .box
这样可以直接用文件名来指示识别结果
C.开始训练
D.提出不符合值(比如识别结果不是5个字符)
第12章 避开采集陷阱
常用采集陷阱:
一、让网络机器人看起来更像人类:
修改请求头:HTTP定义了十几种古怪的请求头,大多数不常用
比如User-Agent:Python-urllib/3.4
处理cookie
注意间隔时间
二、表单陷阱
1隐含输入字段值
a.表单某个字段的值为服务器分配的随机值,该值不可替换
b.一个常用字段名,并不是代表常用的意义,用以混淆机器人
2.蜜罐
设置一些不可见内容或者链接,如果机器人访问了,即被发现
第十三章 测试
单元测试
1.每个单元测试用于测试一个部件的功能,但是一个部件的所有单元测试应该继承在同一个类里
2.每个单元测试可以完全独立运行,且不能对其他单元测试形成干扰
3.单元测试通常至少包含一个断言
4.单元测试与生产代码是分离的
第14章 远程采集
为了避免采集IP地址被封杀:让你的机器人更像人类
Tor代理服务器
Tor: The Onion Router,IP地址匿名手段。由网络志愿者服务器构建的洋葱路由器网络,通过不同服务器构成多个层,把客户端包在最里面。数据进入网络之前会被加密,因此任何服务器都不能偷取通信数据。想查出通信的真正起点和终点,需要破解所有通信链上的电脑,而这基本不可能
Tor是人权工作者和政治避难人员与记者通信的常用手段