python爬虫入门-学习urllib和requests使用,模拟请求

前言

python爬虫入门-通过茅台脚本讲些爬虫知识,应用和价值

上篇我们了解了爬虫的基本知识,这次我们来学习下,如何用Python模拟浏览器访问网站和登录。

正文

Python如此方便,正是因为它提供了很多实现好各种功能的库,它内置了许多非常有用的模块,无需额外安装和配置,即可直接使用。
同时也有很多第三方模块,我们只需要用好各种工具库和模块,就能实现很多方便的操作,用程序来代替繁琐的功能。

这次我们来学习urllib和requests模块,实现模拟请求。

urllib介绍

Python内置的HTTP请求库,安装好Python就能用,它是最基本的请求库,用于访问网络资源,程序发起请求,获取响应数据,使用该库实现。

主要有4个模块

urllib.request 请求模块
urllib.error 异常处理模块,捕获请求和响应中出现的错误
urllib.parse url解析模块,提供url处理方法,拆分合并
urllib.robotparser robots.txt解析模块

使用

get请求

get请求一般是我们在浏览器地址直接输入一个地址,就能能访问到网页。
urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:

# 导入urllib.request 库
import urllib.request

# 向指定的url发送请求,并返回服务器响应的类文件对象
response = urllib.request.urlopen("http://www.baidu.com")

# 类文件对象支持文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
html = response.read()

# 打印字符串
print (html)

我们可以浏览器上打开百度, 右键选择“查看源代码”,你会发现,跟我们刚才打印出来的是一模一样,经过浏览器渲染,就是好看的百度页面。
也就是说,上面的代码就已经帮我们把百度的首页的全部代码爬了下来。

post请求

一般我们想要向某一个地方发送数据,就需要用到post请求。
像我们登陆网站,下订单等,都是用post实现。

# POST请求的目标URL
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers={"User-Agent": "Mozilla"}

formdata = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyfrom":"fanyi.web",
    "ue":"UTF-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

data = urllib.parse.urlencode(formdata)

request = urllib.request.Request(url, data = data, headers = headers)
response = urllib.request.urlopen(request)
print (response.read())

发送POST请求时,需要特别注意headers的一些属性,这个headers的作用就是让请求模拟浏览器发送。

headers属性有:

Content-Length: 144: 是指发送的表单数据长度为144,也就是字符个数是144个。
Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。
X-Requested-With: XMLHttpRequest :表示Ajax异步请求。

requests

相对于urllib,第三方库requests增加很多实用的高级功能,处理URL资源特别方便。
它包含了urllib全部的功能,可以节约大部分的工作。
一句话概括:Python实现的简单易用的HTTP库

windows安装:

pip install requests

pip list -- 可查看已安装的库

验证安装是否成功:
win键+x 选择 命令提示符。输入以下命令:

Python
import requests
//没报错就成功安装了

GET请求

import requests

kw = {'wd':'英雄联盟'}

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}

# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)

# 查看响应内容,response.text 返回的是Unicode格式的数据
print (response.text)

# 查看响应内容,response.content返回的字节流数据
print (responese.content)

# 查看完整url地址
print (response.url)

# 查看响应头部字符编码
print (response.encoding)

# 查看响应码
print (response.status_code)

使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。

使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。

POST请求

要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据

import requests

formdata = {
    "type":"AUTO",
    "i":"i love python",
    "doctype":"json",
    "xmlVersion":"1.8",
    "keyfrom":"fanyi.web",
    "ue":"UTF-8",
    "action":"FY_BY_ENTER",
    "typoResult":"true"
}

url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null"

headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}

response = requests.post(url, data = formdata, headers = headers)

print (response.text)
# 如果是json文件可以直接显示
print (response.json())`

Cookies 和 Sission

如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:

import requests

response = requests.get("http://www.baidu.com/")

# 返回CookieJar对象:
cookiejar = response.cookies

# 将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)

print (cookiejar)

print (cookiedict)

运行结果:

>>> print (cookiejar)
]>
>>>
>>> print (cookiedict)
{'BDORZ': '27315'}

在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。

抢茅台脚本,一直保持登陆状态的实现:

def _validate_cookies(self):
   """
   验证cookies是否有效(是否登陆)
   通过访问用户订单列表页进行判断:若未登录,将会重定向到登陆页面。
   :return: cookies是否有效 True/False
   """
   url = 'https://order.jd.com/center/list.action'
   payload = {
       'rid': str(int(time.time() * 1000)),
   }
   try:
       resp = self.session.get(url=url, params=payload, allow_redirects=False)
       if resp.status_code == requests.codes.OK:
           return True
   except Exception as e:
       logger.error("验证cookies是否有效发生异常", e)
   return False

后面的请求,都是使用requests.session对象去发起,这样能保证每次请求都是在登陆状态下的。

另外,附上requests的其他常用的方法:

requests.request() 构造一个请求,支持以下各种方法
requests.get() 获取html的主要方法
requests.head() 获取html头部信息的主要方法
requests.post() 向html网页提交post请求的方法
requests.put() 向html网页提交put请求的方法
requests.patch() 向html提交局部修改的请求
requests.delete() 向html提交删除请求

最后

学习urllib和requests使用,是我们学习爬虫最关键的一步。

对我们来说,能学会爬虫,相当于也熟悉了python,可以自己写一写自动化的程序,减少很多重复的劳动,提高我们的工作效率,有更多时间做自己想做的事情。

关注博主公众号 “phper进阶笔记”,获取学习资料,一起学习Python。
希望大家点赞、评论、收藏

你可能感兴趣的:(python爬虫入门-学习urllib和requests使用,模拟请求)