1、模块下载
使用pip进行下载:pip install requests
2、基本使用
2.1、get请求
import requests
response = requests.get("url").content.decode()
另一种表示方式:response = requests.request("get","url").content.decode()
#这里使用的是requests模块,该模块下可以直接.get来进行get请求;
#.content表示以二进制形式输出爬取的内容(还可以用来获取图片、视频等非文字性的资源,解码可以用response.content.decode('utf-8'));.text表示以字符串形式表示内容(比较容易出现乱码);
2.1.1、拼接
示例:百度搜索中国
import requests
headers = {
"User-Agent":"Mozilla/5.0...."
}
params = {"wd":"中国"}
response=requests.get("http://www.baidu.com/s?",params=params, headers=headers)
#params参数的作用:上个例子中,加入params后,我们请求的网址变成了“http://www.baidu.com/s?wd="中国"”;如果还有参数的话比如params = {"wd":"中国","pn"="21"}
则此时网址变成了“http://www.baidu.com/s?wd=中国&pn=21”
get方法会自动完成url对params的拼接,拼接成一个新的url;
2.2、post请求
response=requests.post(url,headers=headers,data=formdata)
print(response.text)
#post请求中的data与get请求中的params都是各自请求的参数,不同的是get是将参数写入url当中,而post请求是将参数不放在url中;
2.3、代理ip
proxy={"http":"代理ip:端口号"}
response=requests.get("http://www.baidu.com",proxies=proxy)
print(response.content.decode())
#多个代理ip:将proxy修改proxy={"http":"代理ip:端口号",
"http1":"代理ip1:端口号1"
"http2":"代理ip2:端口号2"
}
#判断代理ip是否有效(如果proxies与所需要请求的ip类型不一致,比如代理ip是http,需要请求的是https,则请求可以生效,不过是用的自己的真实ip地址):
import telnetlib
try:
telnetlib.Telnet('10.10.1.10', port='1080', timeout=3)
except:
print('ip无效!')
else:
print('ip有效!')
2.4、获取响应的cookie
response=requests.get("http://www.baidu.com")
(1)获取返回的cookiejar对象
cookiejar=response.cookies
(2)将cookiejar转换成字典
cookiedict=requests.utils.dict_from_cookiejar(cooiejar)
print(cookiedict)
#将cookie信息以字典的形式打印出来,dict_from_cookiejar是一个将cookie信息转换成字典形式的方法。
2.5、session模拟登录(cookie模拟登录会有时效限制,用session模拟登录没有时效限制)
#cookie模拟登陆:在headers中加上cookie的信息即可模拟登录;
(1)创建session对象
ses = requests.session()
(2)构造登录所需要的参数
data={" email":"987267387@qq.com ","password":"abc#123 "
}
#email和password是需要在源网址中找到登录的用户名、密码或者其他需要的登录信息在源代码中所表示的名字是什么;
(3)模拟登陆
ses.post("需要登录的网址,能直接进入到登录页面",data=data)
#此种方法也是获取cookie信息,但是获取的路径是通过用户名和密码来进行获取,每次都获取最新的cookie信息,所以不存在时效限制;
(4)请求需要的页面
ses.get("请求页面的url").text
2.6、正则表达式
(1)模块:re------import re
例:strr="张三李四王五赵六"
pat="李四" #简单的正则表达式
rst=re.search(pat,strr)
print(rst)
>>span(2,4),match('李四')
(2)匹配字符
#原子:正则表达式中实现匹配的基本单位;
#元字符:正则表达式中具有特殊含义的字符;
1、匹配普通字符:以普通字符作为原子进行匹配(如上面的那个示例);
2、匹配通用字符:以字符类别作为原子进行匹配;
通用字符有以下:
\w:任意字母/数字/下划线;
\W:和小写的w相反;
\d:十进制数字;
\D:除十进制数字以外的值;
\s:空白字符;
\S:非空白字符;
例:b=18758896285
pat=r"\d\d\d\d\d\d\d\d\d\d\d"(加r的原因:防止被认定为转义字符,取消转义)
print(re.search(pat,b))
>>span(0,11),match='18758896285'
3、匹配数字、英文、中文
#数字[0-9] 表达式:pat=r"[0-9]"
#英文[a-z][A-Z] 表达式:pat=r"[a-z][A-Z]"
#中文[\u4e00-\u9fa5] 表达式:pat=r"[\u4e00-\u9fa5]"
4、原子表(定义一组平等的原子,只要有一个原子匹配成功就算成功)
例 b=18758896285
pat=r"1[3578]7\d\d\d\d\d\d\d\d"#遇上137、157、177、187开头的都可以匹配上;
#原子表中只能以单个字符进行匹配,多个不行(如135、158、157)
4、元字符(正则表达式中具有特殊含义的字符)
(1)常见的元字符
# . 匹配任意字符; \n除外 使用方法:.(匹配一个任意字符)
# ^ 匹配字符串开始位置; 使用方法:^136(匹配开头为136的字符串)
# $ 匹配字符串中结束的位置; 使用方法:6666$(匹配以6666结束的字符串)
# * 重复0次1次多次前面的原子; 使用方法:/d*(表示匹配/d后面的字符:可以是0个即空、1个、多个,从一个字符串从前向后)
# ?重复一次或0次前面的原子; 使用方法:/d?
# + 重复一次或多次前面的原子; 使用方法:/d+
(2)匹配固定次数
用法:{n} : 前面的原子出现了n次;
{n,}:前面的原子至少出现了n次;
{n,m}:出现次数介于n-m之间;
例:a="234654"
pat = r"\d{6}" #匹配有6个字符的字符串
print(re.search(pat,a)
>>span(0,6),match='234654'
(3)匹配多个正则表达式 a|b
pat1 = r"a"
pat2 = r"b"
匹配两个:pat = r"pat1|pat2"
(4)分组(新加的括号表示分组)
a="12213java21312pythonqw110ewq@!#21213"
pat=r"(java).{0,}(python).{0,}(1[012]\d{9})"
print(re.search(pat,a))
>>match='java21312pythonqw110'
#此处有用信息和无用信息在一起,将有用信息提取出来
pat = r"java.{0,}python.{0,}1[012]\d{9}"
print(re.search(pat,a).group(3))
>>110
#group:分组,取到多个匹配中的某一个匹配组下的值;
(5)贪婪匹配和非贪婪匹配(默认贪婪匹配)
贪婪模式:在整个表达式匹配成功的前提下尽可能多的匹配
非贪婪模式:在整个表达式匹配成功的前提下尽可能少的匹配(用?表示非贪婪)
备注:?前面不是原子的话就表示非贪婪模式;
5、compile函数(将正则表达式转换成python内部格式,提高执行效率)
(1)使用方法:
以前的:
a="234654"
pat = r"\d{6}"
print(re.search(pat,a)
>>span(0,6),match='234654'
现在的:
a="234654"
pat = re.compile(r"\d{6}")
print(pat.search(a))
>>span(0,6),match='234654'
(2)模式修正符:忽略大小写----re.I
a="Python"
pat = re.compile(r"python",re.I)
print(pat.search(a))
>>span(0,6),match='Python'
6、match函数和search函数
match函数----匹配开头
search函数----匹配任意位置
#两个函数都是匹配到一次后就不再往后匹配了
例:
a="Python"
pat = re.compile(r"thon",re.I)
print(pat.match(a))
>>None#因为match函数只从开头进行对比,开头不对就匹配不到;
7、findall()函数和finditer()函数
#findall():查找所有匹配内容,装到列表中;
#finditer():查找所有匹配的内容,装到迭代器中;
#迭代器:迭代器中的内容必须用for循环提取出来;
a="python----python-----python--"
pat = re.compile(r"python")
(1) print(pat.findall(a)) #在字符串a中找到所有满足正则表达式的内容输入到一个列表中;
>>['python','python','python']
(2) data=pat.finditer(a)#将匹配的内容装到迭代器中;
for i in data:
print(i)#只有这样才能输出迭代器中的内容
>>span=(0,6),match='python'
span=(10,16),match='python'
span=(21,27),match='python'
8、split函数和sub函数
#split():按照能够匹配的子串将字符串分割后返回列表;
例:pat1=re.compile(r",+)
result=pat1.split(strr)
以一个或多个,来分割,输出分割后的字符到列表中;
#sub():用于替换;
例:result=pat2.sub("666",strr)
用“666”字符串来代替strr代表的字符串,可以用于替换文章中想要替换的字符串;