商业爬虫学习笔记day2
1. get传参
(1)url中包含中文报错解决方法
urllib.request.quote("包含中文的url", safe = "string.printtable")
(2)字典传参
最终url由url和参数拼接而成,而参数(params)的类型为字典,所以拼接要将字典参数转化为字符串类型,如下:
import urllib.request
import urllib.parse
import string def get_params():
url = "http://www.baidu.com/s?" params = {
"wd": "中文",
"key": "zhang",
"value": "san"
}
str_params = urllib.parse.urlencode(params)
print(str_params) #此处打印的结果为 wd=%E4%B8%AD%E6%96%87&key=zhang&value=san
final_url = url + str_params
# 将带有中文的url 转译成计算机可以识别的url
end_url = urllib.parse.quote(final_url, safe=string.printable)
print(end_url)
response = urllib.request.urlopen(end_url)
data = response.read().decode("utf-8")
print(data)
get_params()
2. post
urllib.request.openurl(url, data = "服务器接收的数据")
3.请求头:
urlib.request.openurl(),查看源码可发现此方法并没有headers属性,所以得要自己定义一个请求对象,而这个对象中有headers属性
request = urllib.request.Request(url)
request_headers = request.headers # 获取到请求头的信息
(1)创建请求对象:urllib.request.Request(url)
(2)加User-Agent: 模拟真实的浏览器发送请求(若使用同一个User-Agent短时间发送多次请求,对方服务器就能察觉出是爬虫,所以可以定义一个User-Agent池,随机从中获取代理)
import urllib.request
import random def load_baidu(): url = "http://www.baidu.com"
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
"Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50" ]
#每次请求的浏览器都是不一样的
random_user_agent = random.choice(user_agent_list)
request = urllib.request.Request(url)
#增加对应的请求头信息(user_agent)
request.add_header("User-Agent",random_user_agent) #请求数据
response = urllib.request.urlopen(request)
#请求头的信息
print(request.get_header("User-agent")) load_baidu()
(3)request.add_header(动态添加head数据)
(4)响应头response.header
代码
import urllib.request def load_baidu():
url = "http://www.baidu.com"
header = {
# 浏览器的版本
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
"Haha": "hehe" # 无效,请求头中无此信息,在后面打印请求头也可看出无此项
}
# 创建请求对象
request = urllib.request.Request(url)
# print(request)
# print(request.headers)
# 动态去添加head的信息
request.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36")
# 请求网络数据(不在此处加请求头信息是因为此方法系统没有提供参数)
response = urllib.request.urlopen(request)
data = response.read().decode("utf-8") # 获取完整的url
final_url = request.get_full_url()
print(final_url)
# 获取请求头的信息(所有header信息)
request_headers = request.headers # 第一种方法
print(request_headers)
# 第二种方法,注意:首字母需要大写,其它字母都小写
request_headers = request.get_header("User-agent")
print(request_headers)
with open("02header.html", "w", encoding="utf-8")as f:
f.write(data) load_baidu()
4. IP代理:
若使用同一个IP短时间发送多个请求,被请求的服务器也能发现是爬虫,此时就要用不同的ip去发送请求,就涉及到IP代理
(1)免费的IP:时效性差,错误率高
付费的IP:贵花钱,也有失效不能用的
(2)IP分类:
透明:对方知道我们的真实IP
匿名:对方不知道我们真实的ip,但知道你使用了代理
高匿:对方不知道我们真实的IP,也不知道我们使用了代理
5. handler
(1)urllib.request.urlopen()方法中并没有添加代理的功能,需要我们自己定义这个功能,所以要讲下handler,由urlopen()方法的源码可知,其也是创建相应的handler,然后根据此handler创建opener,最后通过opener.open()发送请求
代码:
import urllib.request
import urllib.request def handler_openner():
#系统的urlopen并没有添加代理的功能所以需要我们自定义这个功能
#urlopen为什么可以请求数据 handler处理器
#自己的oppener请求数据
# urllib.request.urlopen()
url = "https://blog.csdn.net/m0_37499059/article/details/79003731"
#创建自己的处理器
handler = urllib.request.HTTPHandler()
#创建自己的oppener
opener=urllib.request.build_opener(handler)
#用自己创建的opener调用open方法请求数据
response = opener.open(url)
# data = response.read()
data = response.read().decode("utf-8")
with open("02header.html", "w", encoding="utf-8")as f:
f.write(data) handler_openner()
(2)创建对应的处理器(handler)
1. 代理处理器:ProxyHandler
2. 利用ProxyHandler创建opener:
3. opener.open(url)就可以请求数据
具体代码如下
import urllib.request
def proxy_user():
proxy_list = [
{"https":""},
# {"https":"106.75.226.36:808"},
# {"https":"61.135.217.7:80"},
# {"https":"125.70.13.77:8080"},
# {"https":"118.190.95.35:9001"}
]
for proxy in proxy_list:
print(proxy)
#利用遍历出来的ip创建处理器
proxy_handler = urllib.request.ProxyHandler(proxy)
#创建opener
opener = urllib.request.build_opener(proxy_handler)
try:
data = opener.open("http://www.baidu.com",timeout=1)
haha = data.read()
print(haha)
except Exception as e:
print(e)
proxy_user()
商业爬虫学习笔记day2的更多相关文章
- 商业爬虫学习笔记day1
day1 一. HTTP 1.介绍: https://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html http://blog.csdn.ne ...
- 商业爬虫学习笔记day4
一.获取登录后页面信息的两种方法 1.第一种方法: 人为把有效cookies加到请求头中,代码如下 import urllib.request # 确定url url = "https:// ...
- 商业爬虫学习笔记day3
一. 付费代理发送请求的两种方式 第一种方式: (1)代理ip,形式如下: money_proxy = {"http":"username:pwd@192.168.12. ...
- 商业爬虫学习笔记day8-------json的使用
一. 简介 JSON,全称为JavaScript Object Notation(JavaScript对象标记),它通过对象和数组的组合来表示数据,是一种轻量级的数据交换格式.它基于 ECMAScri ...
- 商业爬虫学习笔记day7-------解析方法之bs4
一.Beautiful Soup 1.简介 Beautiful Soup 是python的一个库,最主要的功能是从网页抓取数据.其特点如下(这三个特点正是bs强大的原因,来自官方手册) a. Beau ...
- 商业爬虫学习笔记day6
一. 正则解析数据 解析百度新闻中每个新闻的title,url,检查每个新闻的源码可知道,其title和url都位于<a></a>标签中,因为里面参数的具体形式不一样,同一个正 ...
- 商业爬虫学习笔记day5
一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- python网络爬虫学习笔记(二)BeautifulSoup库
Beautiful Soup库也称为beautiful4库.bs4库,它可用于解析HTML/XML,并将所有文件.字符串转换为'utf-8'编码.HTML/XML文档是与“标签树一一对应的.具体地说, ...
随机推荐
- 重建二叉树 牛客网 剑指Offer
重建二叉树 牛客网 剑指Offer 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3, ...
- 就因为把int改成Integer,第2天被辞了
本文节选自<设计模式就该这样学>之享元模式(Flyweight Pattern) 1 故事背景 一个程序员就因为改了生产环境上的一个方法参数,把int型改成了Integer类型,因为涉及到 ...
- 更改mysql数据库根目录
1,查看原根目录 2,然后关闭数据库服务 3,cp -r 源根目录到目的根目录 4,修改my.cnf文件定义的根目录位置到目的根目录 5,启动数据库
- 测试平台系列(71) Python定时任务方案
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 定时任务 定时任务,顾名思义: ...
- WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件)
系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...
- 手撸markdown web server
先上效果图 在线预览 powered by kingreatwill/mdserve. markdown项目:https://github.com/kingreatwill/open 目的 经常写笔记 ...
- C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用. 互斥锁和条 ...
- kafaka高效吞吐量-生产端,服务端,消费端
零拷贝:sendfile 生产端 生产端:消息压缩,缓存批量发送,异步解耦 多线程并发:防止某一个业务阻塞等待 接收消息缓存 BufferPool设计:不释放 服务端 Reactor模型,顺序写,页缓 ...
- 我罗斯方块第二次作业(Player类)
我罗斯方块第二次作业 我的任务 完成player类的编写 player类的测试 我的计划 类的设计: Player类作为一个玩家类,需要处理和玩家有关的所有信息,以及维护玩家的游戏页面map.关于玩家 ...
- 设计模式学习-使用go实现享元模式
享元模式 定义 优点 缺点 适用场景 代码实现 享元模式和单例模式的区别 参考 享元模式 定义 享元模式(Flyweight),运用共享技术有效的支持大量细粒度的对象. 享元模式的意图是复用对象,节省 ...