1. get传参

(1)url中包含中文报错解决方法

urllib.request.quote("包含中文的url", safe = "string.printtable")

(2)字典传参

最终url由url和参数拼接而成,而参数(params)的类型为字典,所以拼接要将字典参数转化为字符串类型,如下:

  1. import urllib.request
  2. import urllib.parse
  3. import string
  4.  
  5. def get_params():
  6. url = "http://www.baidu.com/s?"
  7.  
  8. params = {
  9. "wd": "中文",
  10. "key": "zhang",
  11. "value": "san"
  12. }
  13. str_params = urllib.parse.urlencode(params)
  14. print(str_params) #此处打印的结果为 wd=%E4%B8%AD%E6%96%87&key=zhang&value=san
  15. final_url = url + str_params
  16. # 将带有中文的url 转译成计算机可以识别的url
  17. end_url = urllib.parse.quote(final_url, safe=string.printable)
  18. print(end_url)
  19. response = urllib.request.urlopen(end_url)
  20. data = response.read().decode("utf-8")
  21. print(data)
  22. get_params()

2. post

urllib.request.openurl(url, data = "服务器接收的数据")

3.请求头:

urlib.request.openurl(),查看源码可发现此方法并没有headers属性,所以得要自己定义一个请求对象,而这个对象中有headers属性

  1. request = urllib.request.Request(url)
    request_headers = request.headers # 获取到请求头的信息

(1)创建请求对象:urllib.request.Request(url)

(2)加User-Agent: 模拟真实的浏览器发送请求(若使用同一个User-Agent短时间发送多次请求,对方服务器就能察觉出是爬虫,所以可以定义一个User-Agent池,随机从中获取代理)

  1. import urllib.request
  2. import random
  3.  
  4. def load_baidu():
  5.  
  6. url = "http://www.baidu.com"
  7. user_agent_list = [
  8. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1",
  9. "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0",
  10. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
  11. "Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50"
  12.  
  13. ]
  14. #每次请求的浏览器都是不一样的
  15. random_user_agent = random.choice(user_agent_list)
  16. request = urllib.request.Request(url)
  17. #增加对应的请求头信息(user_agent)
  18. request.add_header("User-Agent",random_user_agent)
  19.  
  20. #请求数据
  21. response = urllib.request.urlopen(request)
  22. #请求头的信息
  23. print(request.get_header("User-agent"))
  24.  
  25. load_baidu()

(3)request.add_header(动态添加head数据)

(4)响应头response.header

代码

  1. import urllib.request
  2.  
  3. def load_baidu():
  4. url = "http://www.baidu.com"
  5. header = {
  6. # 浏览器的版本
  7. "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",
  8. "Haha": "hehe" # 无效,请求头中无此信息,在后面打印请求头也可看出无此项
  9. }
  10. # 创建请求对象
  11. request = urllib.request.Request(url)
  12. # print(request)
  13. # print(request.headers)
  14. # 动态去添加head的信息
  15. 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")
  16. # 请求网络数据(不在此处加请求头信息是因为此方法系统没有提供参数)
  17. response = urllib.request.urlopen(request)
  18. data = response.read().decode("utf-8")
  19.  
  20. # 获取完整的url
  21. final_url = request.get_full_url()
  22. print(final_url)
  23. # 获取请求头的信息(所有header信息)
  24. request_headers = request.headers # 第一种方法
  25. print(request_headers)
  26. # 第二种方法,注意:首字母需要大写,其它字母都小写
  27. request_headers = request.get_header("User-agent")
  28. print(request_headers)
  29. with open("02header.html", "w", encoding="utf-8")as f:
  30. f.write(data)
  31.  
  32. 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()发送请求

代码:

  1. import urllib.request
  2. import urllib.request
  3.  
  4. def handler_openner():
  5. #系统的urlopen并没有添加代理的功能所以需要我们自定义这个功能
  6. #urlopen为什么可以请求数据 handler处理器
  7. #自己的oppener请求数据
  8. # urllib.request.urlopen()
  9. url = "https://blog.csdn.net/m0_37499059/article/details/79003731"
  10. #创建自己的处理器
  11. handler = urllib.request.HTTPHandler()
  12. #创建自己的oppener
  13. opener=urllib.request.build_opener(handler)
  14. #用自己创建的opener调用open方法请求数据
  15. response = opener.open(url)
  16. # data = response.read()
  17. data = response.read().decode("utf-8")
  18. with open("02header.html", "w", encoding="utf-8")as f:
  19. f.write(data)
  20.  
  21. handler_openner()

(2)创建对应的处理器(handler)

1. 代理处理器:ProxyHandler

2. 利用ProxyHandler创建opener:

3. opener.open(url)就可以请求数据

具体代码如下

  1. import urllib.request
  2.  
  3. def proxy_user():
  4.  
  5. proxy_list = [
  6. {"https":""},
  7. # {"https":"106.75.226.36:808"},
  8. # {"https":"61.135.217.7:80"},
  9. # {"https":"125.70.13.77:8080"},
  10. # {"https":"118.190.95.35:9001"}
  11. ]
  12. for proxy in proxy_list:
  13. print(proxy)
  14. #利用遍历出来的ip创建处理器
  15. proxy_handler = urllib.request.ProxyHandler(proxy)
  16. #创建opener
  17. opener = urllib.request.build_opener(proxy_handler)
  18.  
  19. try:
  20. data = opener.open("http://www.baidu.com",timeout=1)
  21.  
  22. haha = data.read()
  23. print(haha)
  24. except Exception as e:
  25. print(e)
  26.  
  27. proxy_user()

商业爬虫学习笔记day2的更多相关文章

  1. 商业爬虫学习笔记day1

    day1 一. HTTP 1.介绍: https://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html http://blog.csdn.ne ...

  2. 商业爬虫学习笔记day4

    一.获取登录后页面信息的两种方法 1.第一种方法: 人为把有效cookies加到请求头中,代码如下 import urllib.request # 确定url url = "https:// ...

  3. 商业爬虫学习笔记day3

    一. 付费代理发送请求的两种方式 第一种方式: (1)代理ip,形式如下: money_proxy = {"http":"username:pwd@192.168.12. ...

  4. 商业爬虫学习笔记day8-------json的使用

    一. 简介 JSON,全称为JavaScript Object Notation(JavaScript对象标记),它通过对象和数组的组合来表示数据,是一种轻量级的数据交换格式.它基于 ECMAScri ...

  5. 商业爬虫学习笔记day7-------解析方法之bs4

    一.Beautiful Soup 1.简介 Beautiful Soup 是python的一个库,最主要的功能是从网页抓取数据.其特点如下(这三个特点正是bs强大的原因,来自官方手册) a. Beau ...

  6. 商业爬虫学习笔记day6

    一. 正则解析数据 解析百度新闻中每个新闻的title,url,检查每个新闻的源码可知道,其title和url都位于<a></a>标签中,因为里面参数的具体形式不一样,同一个正 ...

  7. 商业爬虫学习笔记day5

    一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...

  8. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  9. python网络爬虫学习笔记(二)BeautifulSoup库

    Beautiful Soup库也称为beautiful4库.bs4库,它可用于解析HTML/XML,并将所有文件.字符串转换为'utf-8'编码.HTML/XML文档是与“标签树一一对应的.具体地说, ...

随机推荐

  1. hdu 1080 Human Gene Functions(DP)

    题意: 人类基因由A.C.G.T组成. 有一张5*5的基因表.每格有一个值,叫相似度.例:A-C:-3.意思是如果A和C配对, 则它俩的相似度是-3[P.S.:-和-没有相似度,即-和-不能配对] 现 ...

  2. 第12课 OpenGL 显示列表

    显示列表: 想知道如何加速你的OpenGL程序么?这一课将告诉你如何使用OpenGL的显示列表,它通过预编译OpenGL命令来加速你的程序,并可以为你省去很多重复的代码. 这次我将教你如何使用显示列表 ...

  3. Linux&C———进程间通信

    管道和有名管道 消息队列 共享内存 信号 套接字 由于进程之间的并不会像线程那样共享地址空间和数据空间,所以进程之间就必须有自己特有的通信方式,这篇博客主要介绍自己了解到的几种进程之间的通信方式,内容 ...

  4. MongoDB与MySQL效率对比

    本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用.顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率.如果只是想学习bulkWrite()的 ...

  5. makefile编译子目录

    make子目录常用方法 一般是 SUB_DIR = lib_src service .PHONY: subdirs $(SUB_DIR) subdirs: $(SUB_DIR) $(SUB_DIR): ...

  6. (三)MySQL数据管理

    3.1 外键(了解即可) 方式一:在创建表的时候,增加约束(麻烦,比较复杂) CREATE TABLE IF NOT EXISTS `student`( `id` INT(4) NOT NULL AU ...

  7. 环境(6)Linux文件系统二

    一:计算机间的数据传输 windows---linux : lrzsz  :需要手动安装 yum  install  lrzsz  -y   ;   rz  将文件从window上传到linux  : ...

  8. 9组-Alpha冲刺-1/6

    一.基本情况 队名:不行就摆了吧 组长博客:https://www.cnblogs.com/Microsoft-hc/p/15526668.html 小组人数: 8 二.冲刺概况汇报 谢小龙 过去两天 ...

  9. 修改eclipse中注释字体而不影响代码字体

    eclipse的注释字体大小如何修改?不改变代码的字体 貌似没有直接的办法,但是可以取个巧: Window --> Preferences --> General --> Appea ...

  10. [bzoj5418]屠龙勇士

    很显然,每一步所选的剑和怪物都是确定的,可以先求出来(不用写平衡树,直接用multiset即可,注意删除要删指针,以下假设第i次攻击用ki攻击的剑,攻击第i只怪)  首先判断无解,即如果存在ai使得g ...