共计 8643 个字符,预计需要花费 22 分钟才能阅读完成。
Python 爬虫与数据分析
你学的太多,练习太少。— 古典
抓取数据但不用 Python
不编码是第一选择
八爪鱼采集器 Octoparse
特点: 内嵌浏览器, 可视化定位, 可提取 JavaScript 生成内容, 提取数据用 xpath, 常用网站模板, 支持云采集, 支持多种数据格式输出和数据库导出 http://www.bazhuayu.com/ 5 分钟演示 https://v.youku.com/v_show/id… 支持部分验证码自动识别 http://www.bazhuayu.com/faq/c… 免费版同时 2 个线程, 最多 10 个任务
火车采集器
特点: 对接数据库, 可直接导入 cmshttp://www.locoy.com/
很多 cms 自带文章采集工具
如 jeecms, phpCMS, dedeCMS, 帝国 cms(略)
为什么要学 Python
数据分析需要多个阶段, 抓取数据仅是一个环节, 数据需要不断采集, 更新, 清洗, 分析, 可视会展示等多个阶段, 这些过程中 Python 都能应对自如. 属于性阶适中的工具.
vs C
对比 C 语言, 效率弱一些, 但仅是运行效率, 开发效率高很多, 多数项目恰是开发占比高, 一直开发, 偶尔运行成为常态
vs Java
无需编译, 省去很多麻烦, 更适合一次性应用, 或小团队使用, 更灵活.
Life Is Short, Use Python
AI 与机器学习
Python 语言基础
版本的问题
区别
Python 2.x 和 3.x 有很大区别
2to3
使用 2to3 可以自动升级大部分代码
3.x 新特性
https://www.asmeurer.com/pyth…
版本隔离 virtualenv
$ pip3 install virtualenv
$ virtualenv –no-site-packages venv
$ source venv/bin/activate
(venv)$
(venv)$ deactivate
$
常用数据结构
{} 大字典 Dictionary 键值对, 键唯一, 按键可以很快随机查找
[] 方列表 List 元素存储紧凑, 顺序固定, 可排序
(1,) 圆元组 tuple
set() 设集合 set 集合中, 元素唯一, 无相同元素
输入输出, 文本处理, 数组处理
input 终端输入
读文件
open(), read() seek()
写文件
写文件和读文件是一样的,唯一区别是调用 open() 函数时,传入标识符 ’w’ 或者 ’wb’ 表示写文本文件或写二进制文件:
>>> f = open(‘/Users/michael/test.txt’, ‘w’)
>>> f.write(‘Hello, world!’)
>>> f.close()
数组
面向对象基本概念与使用
如何轻松愉快地学 Python
游戏学编程, 熟悉语法, 流程结构, 函数等 https://codecombat.com/ ide: pycharm, vs code, 断点调试
Python 教程
练习题
猜随机数成三角形概率求质数的几种境界质数概率 png 格式简析
图形格式介绍
png, gif, jpg, svg, webp
特色与难点
装饰器
decorator @
生成器
generator
yeild
lambda 表达式
一些常用函数
zip()
map()
filter()
网络协议与文件格式
URL
协议头:// 域名: 端口 / 路径 / 文件? 参数 1 = 参数值 1 & 参数 2 = 参数值 2# 页面锚点
HTTP 协议
https://www.tutorialspoint.co…
无连接: 请求之间不需要保持连接 媒介无关: MIME 类型确定数据内容无状态: 用 cookie 或参数跟踪状态
请求头
通过观察 浏览器 -> 开发者工具 学习
重点掌握
Cookie Referer User-Agent Content-Type
请求方法
GET
最常见, 一般通过 url 传递参数, 幂等性
POST
提交操作, 大量数据时, 上传文件时用
响应状态码
200:请求成功 处理方式:获得响应的内容,进行处理
301:请求到的资源都会分配一个永久的 URL,这样就可以在将来通过该 URL 来访问此资源 查看头里的 Location302:请求到的资源在一个不同的 URL 处临时保存 查看头里的 Location
400:非法请求 401:未授权 403:禁止
404:没有找到
500:服务器内部错误 502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
测试工具
curl
结合浏览器的使用, -o 参数,
wget
断点续传之 -c 参数, 批量下载时的通配符使用
chromium, telnet, netcat
HTML 格式
学习工具
w3cschool.com
json
格式 工具
JavaScript & CSS
适当了解
python 常用抓取工具 / 类库介绍
urllib
import urllib2
response = urllib2.urlopen(“http://www.baidu.com”)
print response.read()
2to3 urllib.py
import urllib.request, urllib.error, urllib.parse
response = urllib.request.urlopen(“http://example.com”)
print(response.read())
练习指导:
Python3 启动, 退出 Ctrl+D
2to3 –help 找出 -w 回写参数
两种执行方式, 命令行, 交互式
参考: https://cuiqingcai.com/947.html
Requests 库
Scrapy
$ pip install Scrapy lxml
PySpider
非常方便并且功能强大的爬虫框架,支持多线程爬取、JS 动态解析,提供了可操作界面、出错重试、定时爬取等等的功能,使用非常人性化。
官网
安装
$ pip install pyspider
使用
$ pyspider all
然后浏览器访问 http://localhost:5000
Selenium & PhantomJS
$pip install selenium
用浏览器进行加载页面
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(‘http://www.baidu.com/’)
驱动浏览器进行搜索
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class PythonOrgSearch(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_search_in_python_org(self):
driver = self.driver
driver.get(“http://www.python.org”)
self.assertIn(“Python”, driver.title)
elem = driver.find_element_by_name(“q”)
elem.send_keys(“pycon”)
elem.send_keys(Keys.RETURN)
assert “No results found.” not in driver.page_source
def tearDown(self):
self.driver.close()
if __name__ == “__main__”:
unittest.main()
用 PhantomJS 保存页面为图片
PhantomJS 相当于无界面浏览器, 可执行脚本和 CSS 内存渲染
phantomjs helloworld.js
var page = require(‘webpage’).create();
page.open(‘http://cuiqingcai.com’, function (status) {
console.log(“Status: ” + status);
if (status === “success”) {
page.render(‘example.png’);
}
phantom.exit();
});
数据提取工具
html, xml, xpath, selector, json
正则表达式
掌握起来, 有一定难度, 多数编辑器支持, 使用场景广, 但不适合结构化数据 (xml, json, html)
Python Re 模块提供
#返回 pattern 对象
re.compile(string[,flag])
#以下为匹配所用函数
re.match(pattern, string[, flags])
re.search(pattern, string[, flags])
re.split(pattern, string[, maxsplit])
re.findall(pattern, string[, flags])
re.finditer(pattern, string[, flags])
re.sub(pattern, repl, string[, count])
re.subn(pattern, repl, string[, count])
参见: https://cuiqingcai.com/912.html
其于 Dom 模型的 jQuery selector
在 Selenium 中或浏览器中直接使用
基于查询语言的 XPath 标准
XPath 语言是基于一个树形结构表示的 XML 文档,提供的导航能力,通过多种属性选择节点的一个标准。XPath 是提取 XML 的工具, 所以需要对 HTML 正行校正
校正工具:
BeautifulSoup
ElementTidy
使用 lxml 完成解析 HTML
>>> from lxml import etree
>>> doc = ‘<foo><bar></bar></foo>’
>>> tree = etree.HTML(doc)
>>> r = tree.xpath(‘/foo/bar’)
>>> len(r)
1
>>> r[0].tag
‘bar’
>>> r = tree.xpath(‘bar’)
>>> r[0].tag
‘bar’
最稳定的结果是使用 lxml.html 的 soupparser。你需要安装 python-lxml 和 python-beautifulsoup,然后你可以执行以下操作:
from lxml.html.soupparser import fromstring
tree = fromstring(‘<mal form=”ed”><html/>here!’)
matches = tree.xpath(“./mal[@form=ed]”)
XPath 文档
维基 https://en.wikipedia.org/wiki…W3C https://www.w3.org/TR/xpath-30/
入门教程
https://www.w3schools.com/xml…
XPath 在线测试工具
https://codebeautify.org/Xpat…
特点: 可以直接加载 url
<root xmlns:foo=”http://www.foo.org/” xmlns:bar=”http://www.bar.org”>
<employees>
<employee id=”1″>Johnny Dapp</employee>
<employee id=”2″>Al Pacino</employee>
<employee id=”3″>Robert De Niro</employee>
<employee id=”4″>Kevin Spacey</employee>
<employee id=”5″>Denzel Washington</employee>
</employees>
<foo:companies>
<foo:company id=”6″>Tata Consultancy Services</foo:company>
<foo:company id=”7″>Wipro</foo:company>
<foo:company id=”8″>Infosys</foo:company>
<foo:company id=”9″>Microsoft</foo:company>
<foo:company id=”10″>IBM</foo:company>
<foo:company id=”11″>Apple</foo:company>
<foo:company id=”12″>Oracle</foo:company>
</foo:companies>
</root>
示例:1. 选择文档节点 /2. 选择“root”元素 /root3. 选择所有 ’employee’ 元素,它们是 ’employees’ 元素的直接子元素。/root/employees/employee4. 选择所有“公司”元素,无论它们在文档中的位置如何。//foo:company5. 选择“公司”元素的“id”属性,无论它们在文档中的位置如何。//foo:company/@id6. 选择第一个“employee”元素的文本值。//employee[1]/text()7. 选择最后一个 ’employee’ 元素。//employee[last()]8. 使用其位置选择第一个和第二个“employee”元素。//employee[position() < 3]9. 选择具有“id”属性的所有“employee”元素。//employee[@id]10. 选择 ’id’ 属性值为 ’3’ 的 ’employee’ 元素。//employee[@id=’3′]11. 选择“id”属性值小于或等于“3”的所有“employee”节点。//employee[@id<=3]12. 选择“companies”节点的所有子项。/root/foo:companies/*13. 选择文档中的所有元素。// *14. 选择所有“员工”元素和“公司”元素。//employee|//foo:company15. 选择文档中第一个元素的名称。name(//*[1])16. 选择第一个“employee”元素的“id”属性的数值。number(//employee[1]/@id)17. 选择第一个“employee”元素的“id”属性的字符串表示形式值。string(//employee[1]/@id)18. 选择第一个“employee”元素的文本值的长度。string-length(//employee[1]/text())19. 选择第一个“company”元素的本地名称,即没有命名空间。string-length(//employee[1]/text())20. 选择“公司”元素的数量。count(//foo:company)21. 选择 ’company’ 元素的 ’id’ 属性的总和。sum(//foo:company/@id)
http://www.xpathtester.com/xpath
使用示例: 用 xpath 怎么提取重复元素中的一个元素
<div class=”container”>
<div class=”col-12 col-sm-3″>
<p class=”title”> 序号 </p>
<p>001</p>
</div>
<div class=”col-12 col-sm-3″>
<p class=”title”> 编号 </p>
<p>999</p>
</div>
<div class=”col-12 col-sm-3″>
<p class=”title”> 列号 </p>
<p>321</p>
</div>
</div>
//p[text()=” 编号 ”]/following-sibling::p[1] 例如:Python+Selenium 获取文本:driver.driver.find_element_by_xpath(//p[text()=” 编号 ”]/following-sibling::p[1]).text 注: Selenium 支持 XPath 和类 jQuery Selector 等多种选择方式.
Firefox 和 XPath
2017 之前的 firefox 版本 + Firebug2017 后 Firefox Developer Edition + Chropath addonhttps://addons.mozilla.org/en…
Chromium 和 XPath
在 Chrome/ Firefox 浏览器中打开网站
按 Ctrl + Shift + I(将打开开发人员工具)Alt+CMD+I
选择仪器窗口顶部的“元素”
选择仪器窗口底部的放大镜
在浏览器中选择所需的元素
右键单击 DOM 树中的选定行,然后选择“复制 XPath”
Chrome Extension XPath Helper (需要科学上网)
数据保存
csv 及 excel 格式
注意引号转义, 可用现成库
MySQL 数据库
安装 MySQL 驱动由于 MySQL 服务器以独立的进程运行,并通过网络对外服务,所以,需要支持 Python 的 MySQL 驱动来连接到 MySQL 服务器。MySQL 官方提供了 mysql-connector-python 驱动,但是安装的时候需要给 pip 命令加上参数 –allow-external:
$ pip install mysql-connector-python –allow-external mysql-connector-python
如果上面的命令安装失败,可以试试另一个驱动:
$ pip install mysql-connector
我们演示如何连接到 MySQL 服务器的 test 数据库:
# 导入 MySQL 驱动:
>>> import mysql.connector
# 注意把 password 设为你的 root 口令:
>>> conn = mysql.connector.connect(user=’root’, password=’password’, database=’test’)
>>> cursor = conn.cursor()
# 创建 user 表:
>>> cursor.execute(‘create table user (id varchar(20) primary key, name varchar(20))’)
# 插入一行记录,注意 MySQL 的占位符是 %s:
>>> cursor.execute(‘insert into user (id, name) values (%s, %s)’, [‘1’, ‘Michael’])
>>> cursor.rowcount
1
# 提交事务:
>>> conn.commit()
>>> cursor.close()
# 运行查询:
>>> cursor = conn.cursor()
>>> cursor.execute(‘select * from user where id = %s’, (‘1’,))
>>> values = cursor.fetchall()
>>> values
[(‘1’, ‘Michael’)]
# 关闭 Cursor 和 Connection:
>>> cursor.close()
True
>>> conn.close()
爬虫常见问题
常见反爬技术
User-Agent
新华网
Referer
频率
36kr.comtaobao.com
用户点击才展示内容
csdn.net 博客
登录后可用内容
taobao.com
各种人机验证 Captcha
封 IP, 封 ID
编码问题 GB2312, GB18030, GKB, UTF-8, ISO8859-1
GB18030 > GBK > GB2312 但相互兼容 UTF- 8 与以上编码不兼容
用代理隐藏 ip
import requests
from lxml import etree
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36’
}
url = ‘https://ip.cn/’
## 下面的网站是用来获取代理 ip 的 API
ip_url = ‘http://proxy.w2n1ck.com:9090/random’
ip = {‘http’ : ‘http://’+requests.get(ip_url).text}
print(ip)
response = requests.get(url, headers=headers, proxies=ip, timeout=10).text
html = etree.HTML(response)
## 提取页面显示的 ip
res = html.xpath(‘//*[@id=”result”]/div/p[1]/code/text()’)
print(res)
模拟登录
图形验证码处量
百度 OCR
https://aip.baidubce.com/rest…
Tesseract + openCV
ML-OCR
效果最好
人工 OCR
手工录入
数据可视化
matplot
echarts
Tableau
高级话题
手机 APP 接口数据抓取
Python3.x+Fiddler 抓取 APP 数据思路是电脑共享 wifi, 手机连这个 wifi, 电脑 wifi 的 IP 做为代理,手机上设置代理.手机信任电脑的代理证书. 中间人攻击完成了. 截获到网络请求再通过参数变换完成抓取 https://segmentfault.com/a/11…
分布式爬虫
数据库或缓存为协调工具
中文分词
结巴分词
自然言语分析
hanlp tlp-cloud
人脸识别
阿里的接口
图形识别
有问题到哪里去问?
Coursera
stackoverflow.com
思否
(c) 2018 Yujiaao 微信:yujiabuao