以前写过一个urllib的爬虫方法,这个库是python内建的,从那篇文章也能够看到,使用起来很繁琐。如今更流行的一个爬虫库就是requests,他是基于urllib3封装的,也就是将以前比较繁琐的步骤封装到一块,更适合人来使用。html
该库中主要有7个方法:request() get() head() post() put() patch() delete() 他们的做用也就是他们的字面意思(例如:get获取网页信息,post提交信息等等),具体的能够自行查询。python
下面先从最简单的使用开始,尽量的用例子展现他均可以干什么。json
1 import requests 2
3 r = requests.get("https://www.icourse163.org/home.htm?userId=1021614219#/home/course") # get方法,从网页上获取信息
4 r.status_code # http请求的返回状态,为200时表示正常访问
5
6 print(r.encoding) # 从HTTPheader中猜想的响应内容编码方式
7 print(r.apparent_encoding) # 从内容分析出响应内容编码方式(备选编码方式)
上面使用get方法就已经获得了网页信息,返回值时200。r字母表明着response,也就是访问网页的响应。网页内的信息可能会有汉字等等,为了方便之后使用,在开始就先说明一下这个,encoding和apparent_encoding在上面解释了,最后是为了使用一个能够把网页正确解析的编码格式。浏览器
通常来讲,可使用r.encoding = 'utf-8'或者r.encoding = r.apparent_encoding。缓存
1 # 已经访问到了网页,那么就要看一下提取到的内容
2
3 r.text # http响应内容的字符串形式,url对应的页面内容
4
5 r.headers # 返回响应的头部信息
6
7 r.content # http响应内容的二进制形式
8
9 r.json # 返回json格式,须要提早导入json包
其中二进制格式,能够方便的存储一些图片格式等等的数据,例如须要下载一个照片,可使用‘wb’格式写到文件当中,固然也能够直接使用库中的方法。服务器
在咱们爬取一些网页的时候,常常会遇到一系列的问题,访问不到页面,禁止访问之类的,或者一些自身代码的一些问题。若是代码量不少,或者具体一点,好比正在从网站爬取一些照片。当跑到其中一张图片时没有正常的访问到,那么整个程序就卡在这里了。后续的照片也就没法爬取了。这固然不是咱们想要的,所以就须要一些对异常的处理,让他出现异常时,继续执行后续的程序。异常捕获在python的基础里面已经有了,就是用那个在这里应用一下。cookie
1 import requests 2 from requests.exceptions import ReadTimeout, ConnectionError, RequestException 3 try: 4 response = requests.get("http://httpbin.org/get", timeout = 0.5) 5 print(response.status_code) 6 except ReadTimeout: 7 print('Timeout') 8 except ConnectionError: 9 print('Connection error') 10 except RequestException: 11 print('Error')
若是是刚接触的人可能看到这么多长串的字符有些记不清,其实也能够先不去管他是什么样的异常,只要是异常就反馈回来。网络
response.raise_for_status() 这个方法能够捕获异常,使得出现异常时就会跳到except中执行,而不影响总体进程。下面是一个通用的格式来捕获异常。session
1 import requests 2
3 def getHtmlText(url): 4 try: 5 r = requests.get(url) 6 r.raise_for_status() # 若是状态不是200,引起HTTPError异常
7 r.encoding = r.apparent_encoding # 不论headers中是否要求编码格式,都从内容中找到实际编码格式,确保顺利解码
8 return r.text 9 except: 10 return '产生异常'
11 if __name__ == "__main__": 12 url = "http://baidu.com"
13 print(getHtmlText(url))
爬取京东上面商品的页面。理一下思路:app
首先要导入网络请求的包(requests)-->经过get方法访问网页-->捕获一下异常看看是否正常访问到页面-->若是返回200,肯定编码格式-->经过response.text查看一下获得的内容是否是想要的。
1 import requests 2 url = "https://item.jd.com/8578888.html"
3 try: 4 r = requests.get(url) 5 r.raise_for_status() 6 r.encoding = r.apparent_encoding 7 print(r.text[:500]) # 因为网页内容比较多,[:500] 表示只看其从0到500个字节的内容
8 except: 9 print("爬取失败")
上面访问的网站并无什么防御,可是如今愈来愈多的网站都是有各类各样的反爬虫机制,其中一种简单的方法就是经过发送请求时头文件中的内容来判断。经过response.headers能够找到访问时候的User-Agent为requests,也就是告诉网站是经过爬虫来访问的。这么明显,固然有些网站会阻止访问。这时候有一个办法,就是用一个浏览器来模拟一下,替换掉User-Agent中的内容。网上搜会有不少,或者直接从你电脑上的浏览器中检查,来查看你的浏览器在访问网页时显示的User-Agent是什么样的。
经过headers,传入一个字典,例如:{"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"}
其实,若是还不放心的话,能够搜一些User-Agent,每次经过随机抽取其中的一个来访问网页,来避免被网站发现。
下面套用上面给出的框架来写这个爬虫:
1 # 模拟浏览器爬取信息
2 import requests 3 url = "https://www.amazon.cn/dp/B074BNFY1H/ref=cngwdyfloorv2_recs_0?pf_rd_p=d0690322-dfc8-4e93-ac2c-8e2eeacbc49e&pf_rd_s=desktop-2&pf_rd_t=36701&pf_rd_i=desktop&pf_rd_m=A1AJ19PSB66TGU&pf_rd_r=2JDNVB7YD5ZF07YQSRQ6&pf_rd_r=2JDNVB7YD5ZF07YQSRQ6&pf_rd_p=d0690322-dfc8-4e93-ac2c-8e2eeacbc49e"
4 try: 5 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60"} 6 r = requests.get(url, headers = headers) 7 print(r.request.headers) # 起初发现503错误,由于亚马逊会限制爬虫,当使用爬虫时,会在头部显示request代理。所以用一个新的user-agent代替原来的
8 r.raise_for_status() 9 r.encoding = r.apparent_encoding 10 print(r.text[:500]) 11 except: 12 print("爬取失败")
1 # 当访问长时间未响应时就再也不等待,由于毕竟爬虫时为了提升效率
2 import requests 3 from requests.exceptions import ReadTimeout 4 try: 5 response = requests.get("http://httpbin.org/get", timeout = 0.5) 6 response.raise_for_status() 7 except: 8 print('Timeout')
1 # 在访问网站时有可能你没有遵照该robots协议,面临被封IP的风险,这样该IP就不能再访问了,大概过段时间才把你从黑名单中拿出来,这时候就用到了IP代理,这个大概介绍一下,由于本人也是初学,能力有限
2
3 import requests 4
5 proxies = { 6 "http": "***************" 7 } 8
9 response = requests.get("https://www.taobao.com", proxies=proxies) 10 print(response.status_code)
这是浏览器缓存,就是咱们在以前访问过该网站后,后留下一下脚印,例如以前请求到的一些信息,或者提交,好比须要登陆的网站,短期内再次进入时候不须要再次输入帐户密码。所以http请求要从很远的服务器中拉取你要的信息,固然效率不会很高,因此,他就会在本地的浏览器中暂且保留一段时间的信息,这段时间内登陆就是从本地来获得网页响应,也会相对快一些。
在爬虫的时候,尤为是须要登陆才能访问的页面,为了让他能够自动化的一直爬取信息,就能够预先找到登陆后在该网页留下的脚印,来放到你的爬虫里,让其自动登陆爬取。
1 import requests 2
3 response = requests.get("https://www.baidu.com") 4 print(response.cookies) # 能够直接调用方法获得当前访问页面时的cookie
在须要登陆的网页时,咱们须要同时请求多个端口来实现,能够用到requests.session(),看一个例子体会一下。
1 import requests 2
3 s = requests.Session() 4 s.get('http://httpbin.org/cookies/set/****/*****') 5 response = s.get('http://httpbin.org/cookies') # 在访问页面的同时打开以前的cookie请求。若是使用requests的get方法的话,你会发现,第一次请求以后,第二次的get是开启的一个新的请求,而不是针对同一个对象,所以不能实现
6 print(response.text)
这点东西并无讲清楚,待我再好好学一下再解释。