初识爬虫二----requests模块

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代表的字符串,可以用于替换文章中想要替换的字符串;

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木头人123。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值