一、爬虫
Python标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
二、基本操作requests
常用的request请求方式:
1.GET请求
方式一、 r1 = requests.get('https://github.com/login') #请求的登录页面, print(r1.text) #通过请求,获取html页面,以字符串的方式返回 方式二、 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url)#打印请求的url print(ret.text)
2.POST请求
# 1、基本POST实例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload) print ret.text # 2、发送请求头和数据实例 import requests import json url = 'https://api.github.com/some/endpoint' payload = {'some': 'data'} headers = {'content-type': 'application/json'} #请求发送的数据,需加上headers,默认是自带的... ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text) print(ret.cookies)#通过cookies再去访问站内其他的页面
3.其他的请求方式:
requests.get(url, params=None, **kwargs) requests.post(url, data=None, json=None, **kwargs) requests.put(url, data=None, **kwargs) requests.head(url, **kwargs) requests.delete(url, **kwargs) requests.patch(url, data=None, **kwargs) requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建 requests.request(method, url, **kwargs)
4.其他参数的示例:
#!/usr/bin/python # -*- coding: UTF-8 -*- import requests def _method_url(): ''' method:请求的类型 url:请求的路径 :return: ''' response = requests.request(method='post', url='http://www.baidu.com') def _param(): # - 可以字典方式 # - 可以是字符串方式 # - 可以字节方式 r1 = requests.get( url='htpp://www.baidu.com', params={"user": "yang", "pwd": "123"} ) # - --字典方式 r2 = requests.get( url='htpp://www.baidu.com', params="user=yang&pwd=123" ) # - --字符串方式 r3 = requests.get( url='htpp://www.baidu.com', params=bytes("user=yang&pwd=123", encoding='utf-8') ) # ---字节方式 #编码报错... r4 = requests.request(method='get', url='http://www.baidu.com', params=bytes("k1=v1&k2=水电费&k3=v3&k3=vv3", encoding='utf8')) def _data(): ''' post:只有psot发送请求才可data :return: ''' # 可以是字典 # 可以是字符串 # 可以是字节 # 可以是文件对象 r1 = requests.post( url='htpp://www.baidu.com', data={ "user": "yangxiang", "commit": "sing in", } ) #- --字典方式 r2 = requests.post( url='htpp://www.baidu.com', data="user=yang;pwd=123" ) #- --字符串方式, 以;分割, r3 = requests.post( url='htpp://www.baidu.com', data=bytes("user=yang;pwd=123", encoding='utf-8') ) #- --字符串方式, 以;分割 r4 = requests.post( url='htpp://www.baidu.com', data=open('data.file.py', mode='r', encoding='utf-8') # 文件内容需要是k1=v1;k2=v2;k3=v3;k3=v4 ) #- --文件传输方式, 以;分割 def _json(): #将json中对应的数据进行序列化成一个字符串,json.dumps(....) #然后发送到服务端的body中,并且Content-Type是{'Content-Type': 'application/json'} r1 = requests.post( url = 'http://www.baidu.com', json={'k1':'v1','k2':'v2'}, ) def _headers(): #发送请求头到服务端 #请求头的方式Content-Type是{'Content-Type': 'application/x-www-form-urlencoded'} r1 = requests.post( url='http://www.baidu.com', json={'k1': 'v1', 'k2': 'v2'}, headers={'Content-Type': 'application/x-www-form-urlencoded'} ) def _cookies(): #发送cookies到服务端 r1 = requests.post( url='http://www.baidu.com', data={ "user": "yangxiang", "commit": "sing in", }, cookies={'cookie':'value'} ) #也可以使用cookiesJar(字典形式就是在此基础上封装的) from http.cookiejar import CookieJar from http.cookiejar import Cookie obj = CookieJar() obj.set_cookie(Cookie(version=0, name='c1', value='v1', port=None, domain='', path='/', secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False, port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False) ) requests.request(method='POST', url='http://127.0.0.1:8000/test/', data={'k1': 'v1', 'k2': 'v2'}, cookies=obj) def _files(): # 发送文件 file_dict = { 'f1': open('readme', 'rb') } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) # 发送文件,定制文件名 file_dict = { 'f1': ('test.txt', open('readme', 'rb')) } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) # 发送文件,定制文件名 file_dict = { 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf") } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) # 发送文件,定制文件名 file_dict = { 'f1': ('test.txt', "hahsfaksfa9kasdjflaksdjf", 'application/text', {'k1': '0'}) } requests.request(method='POST', url='http://127.0.0.1:8000', files=file_dict) def _auth(): '''基本的验证方式''' from requests.auth import HTTPBasicAuth,HTTPDigestAuth res = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('yang','efsdfsadf')) print(res.text) # ret = requests.get('http://192.168.1.1', # auth=HTTPBasicAuth('admin', 'admin')) # ret.encoding = 'gbk' # print(ret.text) # ret = requests.get('http://httpbin.org/digest-auth/auth/user/pass', auth=HTTPDigestAuth('user', 'pass')) # print(ret) # def _timeout(): #访问超时时间 # res = requests.get('http://www.baidu.com',timeout=2) # print(res) res = requests.get('http://www.baidu.com',timeout=(5,1)) print(res) def _allow_redirects(): '''是否允许重定向 allow_redirects=False''' ret = requests.get('http://www.baidu.com', allow_redirects=False) ret.encoding = ret.apparent_encoding print(ret.text) def _proxies(): ''' 代理, 通过ip的限制,网站会根据ip访问的次数进行限制登录, 那么就需要代理,获取和诺ip来进行访问 ''' proxies = { "http": "61.172.249.96:80", "https": "http://61.185.219.126:3128", } proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'} ret = requests.get("http://www.proxy360.cn/Proxy", proxies=proxies) print(ret.headers) from requests.auth import HTTPProxyAuth proxyDict = { 'http': '77.75.105.165', 'https': '77.75.105.165' } auth = HTTPProxyAuth('username', 'mypassword') r = requests.get("http://www.google.com", proxies=proxyDict, auth=auth) print(r.text) def _stream(): #流的方式,超大文件,一点一点的接收 ret = requests.get('http://127.0.0.1:8000/test/', stream=True) #可以打开一个文件,一点一点的写入... print(ret.content) ret.close() # 自动关闭上下文.. from contextlib import closing with closing(requests.get('http://httpbin.org/get', stream=True)) as r: # 在此处理响应。 for i in r.iter_content(): print(i) def _session(): session = requests.Session() ### 1、首先登陆任何页面,获取cookie i1 = session.get(url="http://dig.chouti.com/help/service") ### 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权 i2 = session.post( url="http://dig.chouti.com/login", data={ 'phone': "8615131255089", 'password': "xxxxxx", 'oneMonth': "" } ) i3 = session.post( url="http://dig.chouti.com/link/vote?linksId=8589623", ) print(i3.text)
三、BeautifulSoup的基本方法操作
使用示例:
html_doc = """ <html><head><title>The Dormouse's story</title></head> <body> <a href='#' class='c1'>123</a> </body> </html> """ soup = BeautifulSoup(html_doc, features="lxml")
1. name(标签名称)
tag = soup.find('a') name = tag.name # 获取标签名称 print(name) tag.name = 'span' # 设置标签 print(soup)
2.attr(标签属性)
tag = soup.find('a') attrs = tag.attrs print(attrs) #获取标签的属性 #两种设置标签属性的方式 tag.attrs = {'id':'i1'} tag.attrs['id'] = 'i1' print(soup)
3.children,所有子标签
body = soup.find('body') v = body.children print(v) print([ v for i in v])
4.children,获取子子孙孙的所有标签
body = soup.find('body') v = body.descendants print(v)
5.clear,将标签的所有子标签全部清空(保留标签名)
tag = soup.find('body') tag.clear()#清除所有的子标签 print(soup)
6.decpmpose,递归的删除所有的标签
body = soup.find('body') body.decompose() print(soup)
7.extract,递归的删除所有的标签,并获取删除的标签
body = soup.find('body') v = body.extract() print(v) #获取删除的标签 # print(soup) #删除后的html
8.decode,转换为字符串(含当前标签)
decode_contents(不含当前标签)
body = soup.find('body') v = body.decode() print(v) v = body.decode_contents() print(v)
9.encode,转换为字节(含当前标签)
encode——contents(不含当前标签)
body = soup.find('body') v = body.encode() v = body.encode_contents() print(v)
10.find,获取匹配的第一个标签
tag = soup.find('a') print(tag) tag = soup.find(name='a', attrs={'class': 'c1'}, recursive=True, text='123') #class_:属性也可以这么的去找。也可通过attrs去查找 # tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie') print(tag)
未完待续.......