Spider_basic
网络爬虫
- 定义:网络蜘蛛、网络机器人,抓取网络数据的程序
- 总结:用Python程序去模仿人去访问网站,模仿的越逼真越好
- 目的:通过有效的大量数据分析市场走势、公司决策
企业获取数据的方式
- 公司自有数据
- 第三方数据平台购买
- 数据堂、贵阳大数据交易所
- 爬虫爬取数据
- 市场上没有或者价格太高,利用爬虫程序爬取
Python做爬虫优势
- 请求模块、解析模块丰富成熟,强大的scrapy框架
- PHP:对多线程、异步支持不太好
- JAVA:代码笨重,代码量很大
- C/C++:虽然效率高,但是代码成型很慢
爬虫分类
- 通用网络爬虫(搜索引擎引用,需要遵守robots协议)
- http://www.taobao.com/robots.txt
- 搜索引擎如何获取一个新网站的URL
- 网站主动向搜索引擎提供(百度站长平台)
- 和DNS服务网(万网),快速收录新网站
- 聚焦网络爬虫
- 自己写的爬虫程序:
- 面向主题的爬虫
- 面向需求的爬虫
- 自己写的爬虫程序:
爬取数据步骤
- 确定需要爬取的URL地址
- 通过HTTP/HTTPS协议来获取相应的HTML页面
- 提取HTML页面有用的数据
- 所需数据,保存
- 页面中有其他的URL,继续第2步
工具
Anaconda和Spyder
- Anaconda:开源的Python发行版本
- Spyder:集成开发环境
- Spyder常用快捷键:
- 注释/取消注释:ctrl + 1
- 保存:ctrl + s
- 运行程序:f5
- 自动补全:Tab
Chrome浏览器插件
- 安装步骤
- 右上角 - 更多工具 - 扩展程序
- 点开右上角 - 开发者模式
- 把插件拖拽到浏览器页面,释放鼠标,点击添加扩展...
- 插件介绍
- Proxy SwitchOmega:代理切换插件
- Xpath Helper:网页数据解析插件
- JSON View:查看json格式的数据(好看)
Fiddler抓包工具
- mac安装
- 安装mono
- 执行
/Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import --sync
- 执行
export PATH="/Library/Frameworks/Mono.framework/Versions/5.20.1/bin:$PATH"
- 抓包工具设置
- Tools -> options -> HTTPS -> ...from browers only
- connections:设置端口号 8888
- 设置浏览器代理
- Proxy SwitchOmega -> 选项 -> 新建情景模式 -> HTTP 127.0.0.1 8888 -> 应用选项
- 浏览器右上角图标 -> proxy(self) -> 访问百度
知识点
WEB
- HTTP和HTTS
- HTTP:80
- HTTPS:443,HTTP的升级版,加了一个安全套接层
- GET和POST
- GET:查询参数都会在URL上显示出来
- POST:查询参数和需要提交数据是隐藏在Form表单里的,不会再URL地址上显示
- URL:统一资源定位符
- https:// item.jd.com :80 /26809408972.html #detail
- 协议 域名/IP地址 端口 访问资源的路径 锚点
- User-Agent
- 记录用户的浏览器、操作系统等,为了让用户获取更好的HTML页面效果
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
- Mozilla Firefox:(Gecko内核)
- IE:Trident(自己的内核)
- Linux:KTHML(like Gecko)
- Apple:Webkit(like KHTML)
- Google:Chrome(like Webkit)
- 其他浏览器都是模仿IE/Chrome
- 记录用户的浏览器、操作系统等,为了让用户获取更好的HTML页面效果
爬虫请求模块
- 版本
- python2:urllib2、urllib
- python3:把urllib和urllib2合并,urllib.request
- 常用方法
urllib.request.urlopen("网址")
- 作用:向网站发起一个请求并获取响应
- 字节流 =
response.read()
- 字符串 =
response.read().decode("utf-8")
- encode() : 字符串 --> bytes
- decode() : bytes --> 字符串
- 重构User-Agent
- 不支持重构User-Agent:urlopen()
- 支持重构User-Agent
- urllib.request.Request(添加User-Agent)
- urllib.request.Request("网址",headers="字典")
- User-Agent是爬虫和反爬虫斗争的第一步,发送请求必须带User-Agent
使用流程(见 02_urllib.request.Request.py)
- 利用Request()方法构建请求对象
- 利用urlopen()方法获取响应对象
- 利用响应对象的read().decode("utf-8")获取内容
- 响应对象response的方法
- read():读取服务器响应的内容
- getcode():返回HTTP的响应码
print(respones.getcode())
200 :成功
4XX :服务器页面出错
5XX :服务器出错 - geturl():返回实际数据的URL(防止重定向问题)
import urllib.request
# 1. 创建请求对象(有User-Agent)
url = "http://www.baidu.com/"
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
req = urllib.request.Request(url, headers=headers)
# 2. 获取响应对象
res = urllib.request.urlopen(req)
# 3. 读取响应对象
html = res.read().decode("utf-8")
# 4. 具体操作
# print(html)
print(res.getcode())
print(res.geturl())
200
https://www.baidu.com/
- urllib.parse模块
- urlencode(字典) ## 给中文编码,三个百分号一个汉子,注意:参数一定要为字典。
- 实例见urlrequest.py
import urllib.parse
meinv = {"wd":"美女"}
meinv = urllib.parse.urlencode(meinv)
print(meinv)
wd=%E7%BE%8E%E5%A5%B3
import urllib.request
import urllib.parse
# 拼接URL
baseurl = "http://www.baidu.com/s?"
key = input("请输入要搜索的内容:")
# 进行urlencode()编码
key = urllib.parse.urlencode({"wd":key})
url = baseurl + key
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
# 创建请求对象
req = urllib.request.Request(url, headers=headers)
# 获取响应对象
res = urllib.request.urlopen(req)
html = res.read().decode("utf-8")
# 写入文件
with open("搜索.html", "w", encoding='utf-8') as f:
f.write(html)
- quote(字符串编码)
- unquote(字符串解码)
key = urllib.parse.quote("字符串")
baseurl = "http://www.baidu.com/s?wd="
key = input("请输入要搜索的内容:")
#进行quote()编码
key = urllib.parse.quote(key)
url = baseurl + key
print(url)
练习
- 百度贴吧数据抓取
- 要求:
- 输入要抓取的贴吧名称
- 输入爬取的起始页和终止页
- 把每一页的内容保存到本地
- 第1页.html 第2页.html ... ...
- 步骤:
- 找URL规律,拼接URL
- 第1页:http://tieba.baidu.com/f?kw=美女&pn=0
- 第2页:http://tieba.baidu.com/f?kw=美女&pn=50
- 第3页:http://tieba.baidu.com/f?kw=美女&pn=100
- 第n页:pn=(n-1)*50
- 获取网页内容(发请求获响应)
- 保存(本地文件、数据库)
- 找URL规律,拼接URL
请求方式及实例
GET
- 特点 :查询参数在URL地址中显示
- 案例 :抓取百度贴吧
POST(在Request方法中添加data参数)
- urllib.request.Request(url,data=data,headers=headers)
- data:表单数据以bytes类型提交,不能是str
- 处理表单数据为bytes类型
- 把Form表单数据定义为字典data
- urlencode(data)
- 转为bytes数据类型:bytes()
- 有道翻译案例
- 有道翻译返回的是json格式的字符串,如何把json格式的字符串转换为Python中字典
import json
r_dict = json.loads(r_json)
- urllib.request.Request(url,data=data,headers=headers)
import urllib.request
import urllib.parse
import json
# 请输入你要翻译的内容
key = input("请输入要翻译的内容:")
# 把提交的form表单数据转换为bytes数据类型
data = {'i':key,
'from':'AUTO',
'to':'AUTO',
'smartresult':'dict',
'client':'fanyideskweb',
'salt':'15567713651723',
'sign':'3eee1e0b9cbebd65a65007f497a9b33a',
'ts':'1556771365172',
'bv':'d1dc01b5ffc1e7dfd53e6ee3c347fc81',
'doctype':'json',
'version':'2.1',
'keyfrom':'fanyi.web',
'action':'FY_BY_REALTlME'
}
# 字符串i=key&from=AUTO&to=AUTO&s....
data = urllib.parse.urlencode(data)
data = bytes(data, "utf-8")
# 发请求,获取相应
# url为POST地址,抓包工具抓到的
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
headers = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
# 此处data为form表单数据,为bytes数据类型
req = urllib.request.Request(url, data=data, headers=headers)
res = urllib.request.urlopen(req)
r_json = res.read().decode("utf-8")
r_dict = json.loads(r_json)
print(r_dict["translateResult"][0][0]["tgt"])
请输入要翻译的内容:天堂
heaven
Spider_basic的更多相关文章
- Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)
整理了一下网易云歌曲评论抓取.分析好友信息抓取.淘宝宝贝抓取.今日头条美图抓取的一些代码 抓取网易云评论 进入歌曲界面: http://music.163.com/#/song?id=45318582 ...
随机推荐
- Reference Counting GC (Part one)
目录 引用计数法 计数器值的增减 new_obj()和update_ptr()函数 new_obj()生成对象 update_ptr()更新指针ptr,对计数器进行增减 优点 可即可回收垃圾 最大暂停 ...
- Mysql学习总结(11)——MySql存储过程与函数
摘要:存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在 ...
- MySQL改变表的存储引擎
MySQL提供了多种数据库存储引擎,存储引擎负责MySQL数据库中的数据的存储和提取.不同的存储引擎具有不同的特性,有时可能须要将一个已经存在的表的存储引擎转换成另外的一个存储引擎.有非常多方法能够完 ...
- sqoop 1.4.4-cdh5.1.2高速入门
一.高速入门 (一)下载安装 1.下载并解压 wget http://archive.cloudera.com/cdh5/cdh/5/sqoop-1.4.4-cdh5.1.2.tar.gz tar - ...
- Ajax核心对象——高速上手XmlHttpRequest
引言: 非TGB的.直接跳过吧-- 从开学结束JQuery之后,计算机的进度停了一段时间.某天无聊的时候,又又一次把BS的东西拿过来看了看. 发现里面有非常多既熟悉又陌生的东西. 在学习王兴魁老师的A ...
- 中科燕园GIS外包--移动GIS
移动GIS恰逢其时 得益于移动智能终端的普及和移动互联网的发展,伴随着GIS技术的发展和应用的深入.越来越多的企业和普通消费者開始体会到移动GIS的巨大潜力和价值. 移动GIS轻便灵活,受众面广.随时 ...
- Log4j2 与 SpringMVC 整合
log4j2不仅仅是log4j的简单升级,而是整个项目的重构.官网地址:http://logging.apache.org/log4j/2.x/,大家能够从官网的介绍看出它相比log4j第1代的种种长 ...
- javascript 将时间戳格式化
<script>function getLocalTime(nS) { return new Date(parseInt(nS) * 1000).toLocaleString().repl ...
- #学习笔记#——JavaScript 数组部分编程(五)
11.为数组 arr 中的每个元素求二次方.不要直接修改数组 arr,结果返回新的数组 function square(arr) { var resultArr=new Array(); for(va ...
- 二分图简单概念&&HDU 2063
二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...