Python网络数据采集
飞到花上 采集花粉 经过处理 数据清洗 存储编程可用的数据
urlib BeautifulSoup lxml Scrapy PdfMiner Requests Selenium NLTK Pillow unittset PySocks
知名网站的API MySQL数据库 OpenRefine数据分析工具
PhanthomJS无头浏览器
Tor代理服务器等内容
-----------
关于多进程 multiprocessing
并发 concurrency
集群 cluster
等高性能采集的不多
国内外关于网络数据保护的法律都在不断地制定与完善
作者介绍了美国与网络数据采集相关的法律与典型案例
呼吁网络爬虫严格控制网络数据采集的速度 降低 被采集网站服务的负担 法律问题
语言是思想的解释器 数据是语言的载体
bug是产品声明中的挑战 好产品 是不断面对bug并且战胜bug的结果
--------
每天6点起床
magic魔术
网络数据采集 web Scraping
巫术 wizardry
先写一个简单的网络爬虫并不难 就是先收集数据 再显示到 命令行或者存储到数据库里
github
---------
https://github.com/REMitchell/python-scraping
-------------
screen scraping
data mining
web harvesting
-------------
bots 机器人
--------
如果你上网的唯一方式是用浏览器
那么你失去了很多可能
twitter 或者维基百科的API 发现一个API同时提供了 不同的数据类型
------
市场预测 机器语言翻译 医疗诊断领域 对新闻网站 文章 健康论坛的数据进行采集
-----
Jonathan Harris
Sep Kamvar
在2006年发起的我们感觉挺好
wefeelfine
http://wefeelfine.org/
项目
从大量英文博客中抓取许多
i feel
i am feeling开头的语句
描述这个世界每天 每分钟的 感觉
-------
Bill Lubanovic 写的《Python语言及其应用》
Jessica McKellar 的教学视频
http://shop.oreilly.com/product/110000448.do
-----------
http://www.safaribooksonline.com
---------
域名切换 信息收集 以及 信息存储功能的爬虫
1990年的Nexus浏览器
浏览器本身就是一个程序 可以分解成很多基本组件可以重用 重写
-----------------------------------
被分成一些子模块
urllib.request
urllib.parse
urllib.error
库 里面有模块
----------
python的标准库
BeautifulSoup库的名字 取自 刘易斯 卡罗尔 的《爱丽丝梦游仙境》里的同名诗歌
化平淡为神奇
----
有病没药 天灾
-------
BS4
BeautifulSoup
-----------
sudo apt-get install python-bs4
mac
sudo easy_install pip
pip
pip install beautifulsoup4
------------
prettify---修饰
-----
bsObj.html.body.h1
bsObj.body.h1
bsObj.html.h1
-----------------
万一 爬着爬着 跌机了咋办
-------------
如果服务器不存在的话 urlopen会返回一个None对象
Beautiful对象找不到的时候返回的也是None
标签下面的标签没有的 话
就会
AttributeError错误
---
import urllib.request
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTitle(url):
try:
html=urllib.request.urlopen(html)
except HTTPError as 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/pages/page1.html")
if title==None:
print("题目不能是空")
else:
print(title)
-----------
米开朗其罗
如何完成《大卫》
很简单 只要用锤子 把石头上不像大卫的地方敲掉就好了
=----------
页面解析难题(Gordian Knot)的时候
当网站管理员对网站稍作修改之后 这行代码就会失效 甚至可能会毁掉整个网络爬虫
-------------
寻找 打印此页 的链接
看看网站有没有HTML样式更好的移动版
把自己的请求头设置成处于移动设备的状态 然后接受网站移动版
寻找隐藏在Javascript文件里面的信息
我曾经把一个网站上 的街道地址 整理成格式整洁的数组时候
查看过内嵌谷歌的javascript文件
网站标题也可以从网页的URL链接里获取
如果你找的信息只是存在一个网站上 别的地方没有
三思而后行写代码
--------------
Lambda表达式
本质上就是一个函数
可以作为其他函数的 变量使用
一个函数不是定义成f(x,y)
而是定义成 f(g(x),y)
或者f(g(x),h(x))的形式
----
BeautifulSoup允许我们把特定函数类型当作findAll函数的参数
唯一限制条件是
这些函数必须把一个标签作为参数且返回结果是布尔类型
BeautifulSoup用这个函数来评估它遇到的每个标签对象
最后评估结果为真的标签保留 将其他标签删除
soup.findAll(lambda tag:len(tag.attrs)==2)
这行代码会找出下面的标签:
<div class="body" id="content"></div>
<span style="color:red" class="title"></span>
-----
lambda 表达式选择标签 将是regular expression的完美替代方案
-------
除了使用BeautifulSoup (Python里最受欢迎的HTML解析库之一)
lxml (http://lxml.de/) 解析 HTML XML文档
非常底层的实现 大部分源码用c写的
学习曲线越陡峭 你可以越快学习它
处理HTML文档时很快
-----------
HTML parser Python自带的解析库
不用安装
https://docs.python.org/3/library/html.parser.html
----------
返回的是Python字典对象
可以获取和操作这些属性
myImgTag.attrs["src]
----------------
本质是一种递归
使用网络爬虫你必须谨慎地考虑需要消耗多少网络流量
---
还要尽力思考能不能让采集目标服务器负载更低一些
---------
维基百科六度分割理论
-----
凯文 贝肯(kevin Bacon)
六度分隔值游戏
两个游戏中 都是把两个不相关的 主题
维基百科里是词条之间的链接
凯文 贝肯是用出现在同一部电影里的演员来 链接
用一个总数不超过六条的主题链接起来 包括原来的两个主题
http://oracleofbacon.org/index.php
------------
from urllib.request import urlopen
from bs4 import BeautifulSoup
html=urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
bsObj=BeautifulSoup(html)
for link in bsObj.findAll("a"):
if 'href' in link.attrs:
print(link.attrs['href'])
----------
维基百科的每个页面充满了 侧边栏 页眉 页脚 链接
连接到 分类页面 对话页面 其他不包含词条的页面的链接:
为了判断维基百科的内链是否链接到 一个词条
他写了一个很大的过滤函数
超过100行代码
不幸的是
在项目启动的时候 没有花时间去比较
词条链接和其他链接的差异
---
URL链接不包含分号
在id是bodyContent的div标签里
URL链接都是以/wiki开头
----------
http://regexpal.com/网站 上在线测试正则表达式
-----------
不同邮箱服务器的邮箱地址的具体规则不尽相同
--------
邮箱的正则表达式
---------
[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)
----------
我们后面要建立的爬虫
也是顺着链接从一个页面跳转到另一个页面
描绘出一张网络地图
这次 不再忽略外链 跟着外链跳转
爬虫是不是可以记录我们浏览过的没一个页面上的信息
相比之前我们做的 单个域名采集
互联网采集要难的多
不同网站的布局迥然不同
意味着我们必须要寻找的信息以及查找方式上都极具灵活性
-------------
芝麻街
http://www.sesamestreet.org
------------
我要收集哪些数据?这些数据可以通过采集几个已经确定的 网站 完成吗?
我的爬虫需要发现那些我可能不知道的网站吗
--
我的爬虫到了某个站 是立即顺着出站链接跳到一个新站还是在网站上待会
深入采集网站的内容
有没有我不想采集的一类网站
对非英文网站的 内容感兴趣吗
我的行为引起了某个网站网管的怀疑
我如何避免法律责任
------
写网络爬虫的挑战之一 是你经常要重复一些简单人物
找出网页上的所有链接 区分内链 外链 跳到新的页面
-------
http://scrapy.org/dowmload