Python网络数据采集笔记

2016-07-15 23:48:32

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是人权工作者和政治避难人员与记者通信的常用手段