Python学习——爬虫篇
requests
使用requests进行爬取
下面是我编写的第一个爬虫的脚本
import requests # 导入requests模块
r = requests.get('https://daohang.qq.com').content # 通过requests.get方法访问地址https://daohang.qq.com,再使用r.content获取返回的bytes内容
print(r) # 打印获取到的内容
结果是不是很熟悉?没错,这里的结果和使用urlopen的时候打印r.read()的结果是一样的,因为这里选择了r.content方法,使结果返回的是bytes型的数据,其实等于是html = bytes(bytearray(html, encoding='utf-8')) 。而requests中如果想使结果变的更加美观则不需要urlopen那么复杂。在urlopen中,我们需要使用decode()方法进行解析,而requests中我们只需要将r.content改变为r.text就可以了
import requests
r = requests.get('https://daohang.qq.com').text
print(r)
看到结果了吗?是不是很神奇?
注: urlopen通常是用来爬取网页内的内容 ,而requests.get/post通常是访问的网址接口类的来获取内容
设置headers
import requests
headers = {
"url":"", # 配置headers中的各项参数,headers的作用类似一个字典,字典的键是唯一且不可变的
"Host":"",
"Referer":"",
"User - Agent":"",
}
url = '接口地址'
data = {"service":"","tab":"tab2","username":'xxxx',"password":'xxxx'} # 在data中设置各项参数,在访问的时候可以传参
repsonse = requests.get(url,headers = headers,data = data) .text# 通过requests.get方法对目标链接进行访问,并且调用headers与data两个参数,实现自动登录功能.并通过过r.text实现转码
print(repsonse) # 打印从页面中获取的内容
运行上述代码,我们可以实现一个简单的接口,模拟登陆的功能。那么,为什么我们要去设置headers呢?有些时候,我们并不能够通过链接直接进行访问,所以这个时候,我们就需要通过设置headers,进行完全模拟请求的封包信息进行访问
设置代理
为了避免一些站点对访问的次数和IP的限制,我们在有些时候必须通过设置代理,以及更换代理来帮助我们工作。那么,怎么通过python,去设置代理呢,我们看下面这段代码 import requests proxies = {'代理地址'} response = requests.get('http://python.jobbole.com/81341/',proxies = proxies).text print(response) 这里,我们把代理的地址赋予proxies,再通过使用requests.get进行访问的时候,通过代理去访问,并获取到返回内容 HTTP异常处理 在实际工作中,我们可能因为这样或者是那样的原因,导致请求失败。那么这个时候,我们想要去解决这个错误,首先就是要去定位这个错误。在python中,可是使用URLError库,以及try-except语句来帮助我们捕获相应的异常。下面是一个例子。 import requests proxies = {'代理地址'} try: response = requests.get('http://python.jobbole.com/81341/',proxies = proxies).text except requests.HTTPError as e : print(e.code) print(response) 在这里,我们使用的是URLError的子类,HTTPError进行检查并且打印出我们在发送HTTP请求时,请求对象返回的状态码。当然,我们也可以使用URLError进行对异常的捕获。具体情况具体对待,在这里,我就不一一进行举例说明了。 上面我们描述了对http的异常捕获,如果我们需要对HTTPError和URLError都进行捕获,需要怎么做呢?我们来看看下面的代码 import requests proxies = {'代理地址'} try: response = requests.get('http://python.jobbole.com/81341/', proxies=proxies).text except requests.HTTPError as e: # 捕获http的异常 print(e.code) # 打印http返回的状态码 except requests.URLError as e: # 捕获URLError print(e.reason) # 打印捕获到的URLError信息 else: print(response) # 打印爬取到的内容 首先我们来看一下,这里为什么先去捕获HTTPError呢?在上面我们也讲了,HTTPError是URLError的子类,在编程中,都是子类在父类之前的,所以,这里我们先对HTTPError进行捕获,如果捕获不到HTTPError,我们再对URLError进行捕获,如果,没有捕获到异常,就打印出爬取的内容。 Cookies 获取cookies
cookie,是指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。 比如说有些网站需要登录之后才能访问某些页面,,在登录之前你想爬取某些页面,是不被允许的。这个时候,我们就可以利用cookie,进行爬取就可以啦。 import requests request_req = 'https://www.baidu.com/' response = requests.get(request_req) print(response.text) print(response.cookies) # 打印获取到的内容中的cookies 运行上述代码我们可以获得从百度爬取到的代码和cookies,我这里仅仅只是打印了爬取到的所有的cookies。 当然我们也可以在cookies后面输入我们需要的key来打印我们需要的cookie,那么这个key要怎么打印呢,我举个例子,把上面的 print(response.cookies)换成 print(response.cookies['PSTM']) 就可以打印出key为['PSTM']的cookies了。 再来说说key的作用。我们可以通过打印key的cookies获取到我们想要value,是不是很方便呢? 我们也可以自己去定义请求的cookies。那么自己定义cookies的作用又是什么呢? 我们通过自己定义cookies,把cookies写死,其实就是为了伪造请求,然后实现自动登录。 好吧,这里又讲到了自动登录,那么通过cookies实现的自动登录与上面我们传参的自动登录有什么不同呢?从功能上来讲,是没有区别的。但是注意,请注意,cookies是有时效性的。一旦当cookies超时之后,就无法继续自动登录了。而我们传参进行的自动登录,是可以保证每一次都会成功的。 通过cookies自动登录 下面给大家做一个通过获取cookies,并保存到本地,再通过cookies进行模拟登录的示范。 import requests import unittest import json class Login(): #定义一个方法,对请求方法进行封装 def login(self,method,url,getparams,postparams): #创建ssesion ssesion = requests.session() result='' #对请求方法进行判断,进而选择使用的请求方法,并且打印错误信息 if method=='GET': if getparams!='': try: result=ssesion.get(url,getparams) except: print(result.status_code,result.reason) else: result=ssesion.get(url) print(result) if method=='POST': if postparams!='': try: result=ssesion.post(url,postparams) except: print(result.status_code,result.reason) #将返回值进行json格式解码 jsdata=json.loads(result.text) return jsdata #定义一个类,对上面的方法,类进行调用 class APIGetAdList(unittest.TestCase): def test_call(self): api=Login() getparams='' postparams='' api.login('GET','url', getparams, postparams) if __name__ == "__main__": unittest.main() 上面这段代码,是通过ssesion方法,获取cookies,从而实现了一个初级的模拟登陆的功能。我们来讲一下上面这段代码的逻辑。 1、我们定义一个Login的类,里面用来定义login的方法 2、定义一个login的方法,里面包含method,url,getparams,postparams四项参数 3、创建一个ssesion, 4、通过if对method参数进行判断,进而对请求方法进行选择 5、尝试去请求目标url,如果出错就打印http状态码和错误信息 6、对返回的内容进行json格式的解码并返回解码后的内容 7、定义一个APIGetAdList类,用来定义一个传参的函数 8、通过定义一个test_call(self)函数,对Login类的login方法中的各项参数进行传参 9、调用主方法,运行脚本 注: get和post的选择 如果是爬虫,那么抓包就能看到请求方法,如果有接口文档,就可以根据接口文档去选择请求方法。 看起来,并不是很难不是吗?用到的都是我们目前已经掌握的东西。requests,ssesion,httperror,json. 到这里,我们的第一个,初级的登录脚本也算是正式完成了。是不是很有成就感呢?我这段代码,自己查查找找,问人,网上这里扣点代码,那里扣点代码,写写,改改的总共花了差不多一周的时间才完成。我们很多时候都面临一个问题,就是,思路很清晰,但是真的要自己写的时候,却发现总是有这样或者是那样的问题。这个时候,我们不妨去网上,搜索一下,找一下类似的代码作为借鉴。我们并不是抄袭,自学嘛,就是这样。多写写,多练练,就会掌握了。希望大家共同进步。
为了避免一些站点对访问的次数和IP的限制,我们在有些时候必须通过设置代理,以及更换代理来帮助我们工作。那么,怎么通过python,去设置代理呢,我们看下面这段代码 import requests proxies = {'代理地址'} response = requests.get('http://python.jobbole.com/81341/',proxies = proxies).text print(response) 这里,我们把代理的地址赋予proxies,再通过使用requests.get进行访问的时候,通过代理去访问,并获取到返回内容 HTTP异常处理 在实际工作中,我们可能因为这样或者是那样的原因,导致请求失败。那么这个时候,我们想要去解决这个错误,首先就是要去定位这个错误。在python中,可是使用URLError库,以及try-except语句来帮助我们捕获相应的异常。下面是一个例子。 import requests proxies = {'代理地址'} try: response = requests.get('http://python.jobbole.com/81341/',proxies = proxies).text except requests.HTTPError as e : print(e.code) print(response) 在这里,我们使用的是URLError的子类,HTTPError进行检查并且打印出我们在发送HTTP请求时,请求对象返回的状态码。当然,我们也可以使用URLError进行对异常的捕获。具体情况具体对待,在这里,我就不一一进行举例说明了。 上面我们描述了对http的异常捕获,如果我们需要对HTTPError和URLError都进行捕获,需要怎么做呢?我们来看看下面的代码 import requests proxies = {'代理地址'} try: response = requests.get('http://python.jobbole.com/81341/', proxies=proxies).text except requests.HTTPError as e: # 捕获http的异常 print(e.code) # 打印http返回的状态码 except requests.URLError as e: # 捕获URLError print(e.reason) # 打印捕获到的URLError信息 else: print(response) # 打印爬取到的内容 首先我们来看一下,这里为什么先去捕获HTTPError呢?在上面我们也讲了,HTTPError是URLError的子类,在编程中,都是子类在父类之前的,所以,这里我们先对HTTPError进行捕获,如果捕获不到HTTPError,我们再对URLError进行捕获,如果,没有捕获到异常,就打印出爬取的内容。 Cookies 获取cookies
cookie,是指某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。 比如说有些网站需要登录之后才能访问某些页面,,在登录之前你想爬取某些页面,是不被允许的。这个时候,我们就可以利用cookie,进行爬取就可以啦。 import requests request_req = 'https://www.baidu.com/' response = requests.get(request_req) print(response.text) print(response.cookies) # 打印获取到的内容中的cookies 运行上述代码我们可以获得从百度爬取到的代码和cookies,我这里仅仅只是打印了爬取到的所有的cookies。 当然我们也可以在cookies后面输入我们需要的key来打印我们需要的cookie,那么这个key要怎么打印呢,我举个例子,把上面的 print(response.cookies)换成 print(response.cookies['PSTM']) 就可以打印出key为['PSTM']的cookies了。 再来说说key的作用。我们可以通过打印key的cookies获取到我们想要value,是不是很方便呢? 我们也可以自己去定义请求的cookies。那么自己定义cookies的作用又是什么呢? 我们通过自己定义cookies,把cookies写死,其实就是为了伪造请求,然后实现自动登录。 好吧,这里又讲到了自动登录,那么通过cookies实现的自动登录与上面我们传参的自动登录有什么不同呢?从功能上来讲,是没有区别的。但是注意,请注意,cookies是有时效性的。一旦当cookies超时之后,就无法继续自动登录了。而我们传参进行的自动登录,是可以保证每一次都会成功的。 通过cookies自动登录 下面给大家做一个通过获取cookies,并保存到本地,再通过cookies进行模拟登录的示范。 import requests import unittest import json class Login(): #定义一个方法,对请求方法进行封装 def login(self,method,url,getparams,postparams): #创建ssesion ssesion = requests.session() result='' #对请求方法进行判断,进而选择使用的请求方法,并且打印错误信息 if method=='GET': if getparams!='': try: result=ssesion.get(url,getparams) except: print(result.status_code,result.reason) else: result=ssesion.get(url) print(result) if method=='POST': if postparams!='': try: result=ssesion.post(url,postparams) except: print(result.status_code,result.reason) #将返回值进行json格式解码 jsdata=json.loads(result.text) return jsdata #定义一个类,对上面的方法,类进行调用 class APIGetAdList(unittest.TestCase): def test_call(self): api=Login() getparams='' postparams='' api.login('GET','url', getparams, postparams) if __name__ == "__main__": unittest.main() 上面这段代码,是通过ssesion方法,获取cookies,从而实现了一个初级的模拟登陆的功能。我们来讲一下上面这段代码的逻辑。 1、我们定义一个Login的类,里面用来定义login的方法 2、定义一个login的方法,里面包含method,url,getparams,postparams四项参数 3、创建一个ssesion, 4、通过if对method参数进行判断,进而对请求方法进行选择 5、尝试去请求目标url,如果出错就打印http状态码和错误信息 6、对返回的内容进行json格式的解码并返回解码后的内容 7、定义一个APIGetAdList类,用来定义一个传参的函数 8、通过定义一个test_call(self)函数,对Login类的login方法中的各项参数进行传参 9、调用主方法,运行脚本 注: get和post的选择 如果是爬虫,那么抓包就能看到请求方法,如果有接口文档,就可以根据接口文档去选择请求方法。 看起来,并不是很难不是吗?用到的都是我们目前已经掌握的东西。requests,ssesion,httperror,json. 到这里,我们的第一个,初级的登录脚本也算是正式完成了。是不是很有成就感呢?我这段代码,自己查查找找,问人,网上这里扣点代码,那里扣点代码,写写,改改的总共花了差不多一周的时间才完成。我们很多时候都面临一个问题,就是,思路很清晰,但是真的要自己写的时候,却发现总是有这样或者是那样的问题。这个时候,我们不妨去网上,搜索一下,找一下类似的代码作为借鉴。我们并不是抄袭,自学嘛,就是这样。多写写,多练练,就会掌握了。希望大家共同进步。