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 PythonAI与机器学习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,) 圆元组 tupleset() 设集合 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 @生成器generatoryeildlambda 表达式一些常用函数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处临时保存 查看头里的 Location400:非法请求 401:未授权 403:禁止 404:没有找到500:服务器内部错误502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。测试工具curl结合浏览器的使用, -o 参数,wget断点续传之 -c 参数, 批量下载时的通配符使用chromium, telnet, netcatHTML 格式学习工具w3cschool.comjson格式 工具JavaScript & CSS适当了解python常用抓取工具/类库介绍urllibimport urllib2 response = urllib2.urlopen(“http://www.baidu.com”)print response.read()2to3 urllib.pyimport urllib.request, urllib.error, urllib.parse response = urllib.request.urlopen(“http://example.com”)print(response.read())练习指导:Python3 启动, 退出 Ctrl+D2to3 –help 找出 -w 回写参数两种执行方式, 命令行, 交互式参考: https://cuiqingcai.com/947.htmlRequests 库Scrapy$ pip install Scrapy lxmlPySpider非常方便并且功能强大的爬虫框架,支持多线程爬取、JS动态解析,提供了可操作界面、出错重试、定时爬取等等的功能,使用非常人性化。官网安装$ pip install pyspider使用$ pyspider all然后浏览器访问 http://localhost:5000Selenium & PhantomJS$pip install selenium用浏览器进行加载页面 from selenium import webdriver browser = webdriver.Chrome() browser.get(‘http://www.baidu.com/')驱动浏览器进行搜索import unittestfrom selenium import webdriverfrom 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.jsvar 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正行校正校正工具:BeautifulSoupElementTidy使用 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 fromstringtree = 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 和 XPath2017之前的 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.rowcount1# 提交事务:>>> 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-1GB18030 > GBK > GB2312 但相互兼容UTF-8与以上编码不兼容用代理隐藏 ipimport requestsfrom lxml import etreeheaders = { ‘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的APIip_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).texthtml = etree.HTML(response)## 提取页面显示的ipres = html.xpath(’//[@id=“result”]/div/p[1]/code/text()’)print(res)模拟登录图形验证码处量百度OCR https://aip.baidubce.com/rest…Tesseract + openCVML-OCR效果最好人工OCR手工录入数据可视化matplotechartsTableau高级话题手机 APP 接口数据抓取Python3.x+Fiddler抓取APP数据思路是电脑共享 wifi, 手机连这个 wifi, 电脑wifi 的 IP做为代理, 手机上设置代理.手机信任电脑的代理证书. 中间人攻击完成了. 截获到网络请求再通过参数变换完成抓取https://segmentfault.com/a/11…分布式爬虫数据库或缓存为协调工具中文分词结巴分词自然言语分析hanlp tlp-cloud人脸识别阿里的接口图形识别有问题到哪里去问?Courserastackoverflow.com思否(c) 2018 Yujiaao微信: yujiabuao