网络爬虫

  • 定义:网络蜘蛛、网络机器人,抓取网络数据的程序
  • 总结:用Python程序去模仿人去访问网站,模仿的越逼真越好
  • 目的:通过有效的大量数据分析市场走势、公司决策

企业获取数据的方式

  1. 公司自有数据
  2. 第三方数据平台购买
    • 数据堂、贵阳大数据交易所
  3. 爬虫爬取数据
    • 市场上没有或者价格太高,利用爬虫程序爬取

Python做爬虫优势

  • 请求模块、解析模块丰富成熟,强大的scrapy框架

    • PHP:对多线程、异步支持不太好
    • JAVA:代码笨重,代码量很大
    • C/C++:虽然效率高,但是代码成型很慢

爬虫分类

  1. 通用网络爬虫(搜索引擎引用,需要遵守robots协议)

    • http://www.taobao.com/robots.txt
    • 搜索引擎如何获取一个新网站的URL
      • 网站主动向搜索引擎提供(百度站长平台)
      • 和DNS服务网(万网),快速收录新网站
  2. 聚焦网络爬虫
    • 自己写的爬虫程序:

      • 面向主题的爬虫
      • 面向需求的爬虫

爬取数据步骤

  1. 确定需要爬取的URL地址
  2. 通过HTTP/HTTPS协议来获取相应的HTML页面
  3. 提取HTML页面有用的数据
    • 所需数据,保存
    • 页面中有其他的URL,继续第2步

工具

Anaconda和Spyder

  1. Anaconda:开源的Python发行版本
  2. Spyder:集成开发环境
    • Spyder常用快捷键:
    • 注释/取消注释:ctrl + 1
    • 保存:ctrl + s
    • 运行程序:f5
    • 自动补全:Tab

Chrome浏览器插件

  • 安装步骤

    1. 右上角 - 更多工具 - 扩展程序
    2. 点开右上角 - 开发者模式
    3. 把插件拖拽到浏览器页面,释放鼠标,点击添加扩展...
  • 插件介绍
    1. Proxy SwitchOmega:代理切换插件
    2. Xpath Helper:网页数据解析插件
    3. JSON View:查看json格式的数据(好看)

Fiddler抓包工具

  1. 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"
  2. 抓包工具设置
    • Tools -> options -> HTTPS -> ...from browers only
    • connections:设置端口号 8888
  3. 设置浏览器代理
    • Proxy SwitchOmega -> 选项 -> 新建情景模式 -> HTTP 127.0.0.1 8888 -> 应用选项
  4. 浏览器右上角图标 -> 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

爬虫请求模块

  • 版本

    • 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)

  1. 利用Request()方法构建请求对象
  2. 利用urlopen()方法获取响应对象
    • 利用响应对象的read().decode("utf-8")获取内容
    • 响应对象response的方法
      1. read():读取服务器响应的内容
      2. getcode():返回HTTP的响应码

        print(respones.getcode())

        200 :成功

        4XX :服务器页面出错

        5XX :服务器出错
      3. 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)

练习

请求方式及实例

  • GET

    1. 特点 :查询参数在URL地址中显示
    2. 案例 :抓取百度贴吧
  • POST(在Request方法中添加data参数)

    1. urllib.request.Request(url,data=data,headers=headers)

      • data:表单数据以bytes类型提交,不能是str
    2. 处理表单数据为bytes类型
      1. 把Form表单数据定义为字典data
      2. urlencode(data)
      3. 转为bytes数据类型:bytes()
    3. 有道翻译案例
    4. 有道翻译返回的是json格式的字符串,如何把json格式的字符串转换为Python中字典

      import json

      r_dict = json.loads(r_json)
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的更多相关文章

  1. Python的几个爬虫代码整理(网易云、微信、淘宝、今日头条)

    整理了一下网易云歌曲评论抓取.分析好友信息抓取.淘宝宝贝抓取.今日头条美图抓取的一些代码 抓取网易云评论 进入歌曲界面: http://music.163.com/#/song?id=45318582 ...

随机推荐

  1. TwinCAT 3中基于UDP协议通讯的C++实现

    因为项目需要,学习了TwinCAT3中使用UDP协议进行通讯的基本知识.这个做个简单的笔记,方便以后查询. 1 概述 倍福为了实现从实时环境中直接访问网卡(network cards)专门提供了一个函 ...

  2. thinkserer TD350 系统损坏后,数据恢复及系统重做过程

    电脑配置: 联想服务器 TD350   E5-2609V4 2*8G 2*4T+R1 塔式 单电 1.系统恢复: 试过很多种方法,均无效 2.数据恢复:  重新安装系统后,直接在D盘查找 , 原C盘的 ...

  3. Oracle Database Sample Schemas

    本文在Creative Commons许可证下发布 最近在钻研Oracle 11gR2,写SQL缺乏Demo表,研究他家的官方资料时发现一块甲骨文已经给我们准备Sample Schemas.比如说SC ...

  4. Swift实战(2)--在工程中添加object-C的类或者第三方框架(附翻译)

    原文地址:http://stackoverflow.com/questions/24002369/how-to-call-objective-c-code-from-swift Using Objec ...

  5. 洛谷 P1964 【mc生存】卖东西

    P1964 [mc生存]卖东西 题目背景 服务器好好玩 题目描述 lcy0x1去服务器的系统商店卖东西. 一个人的背包有21格. 一开始他的背包里有m件不同的物品(不能卖). 他要卖n种物品,每种物品 ...

  6. Python学习笔记3:简单文件操作

    # -*- coding: cp936 -*- # 1 打开文件 # open(fileName, mode) # 參数:fileName文件名称 # mode打开方式 # w     以写方式打开. ...

  7. Objective-C_类的扩展

    一Category的定义和使用 二Extension的定义和使用 三Protocol的定义和使用 delegate的使用 一.Category的定义和使用 Category,分类或类目.主要作用是为没 ...

  8. Zabbix自动发现与自动注册.

    一, 自动发现与自动注册 自动发现? 当场景中出现要添加很多台主机的时候,一台台添加难免太过于繁琐,zabbix提供自动注册,自动发现,可以实现主机的批量添加, zabbix的发现包括三种类型: # ...

  9. 项目: python爬虫 福利 煎蛋网妹子图

    嘿嘿嘿! 嘿嘿嘿! 福利一波, 之前看小甲鱼的python教学视频的时候, 看到上面教的爬虫, 爬美女图片的, 心很痒痒, 但是不知道为啥, 按照视频一个字一个字敲的代码,总是报错, 有一天花了 一下 ...

  10. Spring Cloud Netflix Eureka client源码分析

    1.client端 EurekaClient提供三个功能: EurekaClient API contracts are:* - provide the ability to get Instance ...