1.第一节课大体介绍requests
import requests
r = requests.get("http://weixin.sogou.com/") #request.get基本就能爬取所有的网页了
print(r.status_code) #这个status是200代表成功了,不是200就失败了
print(r.apparent_encoding) #apparent_encoding是用内容分析出来的编码方式
r.encoding = r.apparent_encoding #encoding是在报头里面看到的编码方式,不如上一个准,有的报头里有有的没有
print(r.text)
2.通用框架(这一段代码可以无限抄)
import requests
def getHTMLText(url):
try:
r = requests.get(url,timeout =30)
r.raise_for_status() #如果status值不是200,就返回异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
#python的异常捕获,用try和except来做。在try里面如果发生了异常(异常大概就是程序运行不下去了),捕获到了异常之后,运行except里面的程序。
3.HTTP协议,超文本传输协议。请求与响应模式的无状态的传输协议。
HTTP协议通过URL对资源进行管理,get是获取资源,head是获取头部信息,这两个方法重点掌握。
更改资源,patch,put,delete,post
patch可以局部更新资源,put是全盘覆盖,post可以被存到表单等数据下。
传输资源其实是严格受控的,也就是那四个传输的请求很难被实现,get是最常用的方法,去爬取一些内容。
4.反反爬虫程序
网站方对于爬虫是可以拒绝的,拒绝方式可能是看请求源的header数据,如果header源是由浏览器给出的可以,如果是爬虫就拒绝。
import requests
def getHTMLText(url):
try:
kv = {'user-agent':'Mozilla/5.0'}
r = requests.get(url,timeout =30,headers = kv) #构造一个键值对,然后把这个赋值给headers就能骗过去,尤其注意这里是headers,有s
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
5. 爬取百度和360等搜索结果
import requests
url = "https://www.baidu.com/s"
def getHTMLText(url):
try:
kv = {'wd':'Python'}
r = requests.get(url,params = kv) #构造一个键值对,把搜索的那一部分传入进去
r.raise_for_status() #不同搜索网站的键值对值wd可能不一样,自己去看一下
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
getHTMLText(url)
网站上面的图形交互界面是方便人类使用的,但其实后台的提交都是利用链接的形式来提交的。
如果能知道后台api提交的链接,那就可以用python程序去模拟提交这个请求。
6. 图片爬取的全代码
import requests
import os
url = "******.jpg"
root = "D://123//"
path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url,timeout =30)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
(1)网络上很多的资源都是这样的格式,比如图片,视频,原理都是一样的
(2)split函数是字符串的一个函数
str = "sjsdjfaja123648b sdf52.1"
print(str.split('1'))
a = str.split()
print(a[1])
首先定义一个字符串,然后str.split,默认的分割是按照空白,可能是空格可能是换行,用空白来分割,如果在split的括号里输入了东西,那就按照这个东西来分割。
split方法前面进去的时候是一个字符串,返回是一个数组,分割完了之后好多元素,切成了数组。
被当成分隔符的那个东西,不管是人为输入还是空格,在返回的数组里面都不会存在,直接被删掉了,然后前后断开。
(3)I/O操作
with open('/path/to/file', 'r') as f:
print(f.read())
这里with的作用是把文件用完了之后自动关闭,如果没有with的话,标准流程就是先open,再read,再close。
用了with之后就不担心close的问题了。
小结:
爬虫的视角:网络上的任何内容,不管是内容的获取还是请求的发送,都是有一个url存在的,只要能够获取这个url,什么都可以做到。