爬虫:
1,爬虫基础
#1、什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样。 #2、互联网建立的目的? 互联网的核心价值在于数据的共享/传递:数据是存放于一台台计算机上的,而将计算机互联到一起的目的就是为了能够方便彼此之间的数据共享/传递,否则你只能拿U盘去别人的计算机上拷贝数据了。 #3、什么是上网?爬虫要做的是什么? 我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程。 #3.1 只不过,用户获取网络数据的方式是: 浏览器提交请求->下载网页代码->解析/渲染成页面。 ``` #3.2 而爬虫程序要做的就是: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中 #3.1与3.2的区别在于: ``` 我们的爬虫程序只提取网页代码中对我们有用的数据 #4、总结爬虫 #4.1 爬虫的比喻: 如果我们把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据 ``` #4.2 爬虫的定义: ``` 向网站发起请求,获取资源后分析并提取有用数据的程序 ``` #4.3 爬虫的价值: 互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。
爬虫介绍:
爬虫的本质: 就是向网站发送http请求,就会拿回一些页面/json格式数据(request) 处理数据,解析出有用的东西(re,bs4) 存储(mysql,文件,cvs,redis。mongodb,es) 分析数据。。。 cookie池和代理池(正向代理) 1,有些数据必须登录之后才能拿到,这时就需要模拟登陆。例如验证码,识别不了,就可以手动进行识别,一旦登陆进入之后,这时会有一个cookie或者token的字符串发送给你,还有ip连接,下次发请求你只要携带这个串过去就好,所以本质上要求你登录,就是获取这个串,如果拿到这个串就不用进行登陆,在这里一大群人来请求时,就有一大堆串,这时就产生了cookie池,,或者就是代理池(ip) 2,每次发请求时,拿随机产生的cookie和代理ip。所以每次你向网站发送http请求,这时服务器就无法判断是用户还是爬虫,无法分辨,于是才出现了代理池和cookie池 正向代理和反向代理 1,正向代理:代理自己 2,反向代理:代理服务器 ningx是反向代理服务器(当你发送请求时,他把服务端进行了屏蔽,让你看上去就像一个人或服务器,此后它在进行下一步操作,其实服务器是有很多个) 正向代理:案例 a服务器(想要获取一些资源数据,去访问c服务器,这时访问不到,或者出错,但是a访问的数据b服务器可以从服务器中获得,所以此时a就要访问吧,b再去访问c,这就是正向代理) 你去买票,找了黄牛,黄牛给你去买到票 反向代理:案例 你要租房子,去找了中介,中介手里有一堆房子,但是你不知道中介手里有多少房子,你就说你要租个房子,于是中介就给你一个房子。 1,基础爬虫流程三步骤: 1,请求库(如何发请求) 2,解析(如何解析) 3,存储(存到什么地方) ,2,爬虫框架爬取数据
import re # 获取视频 res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=36') reg_text ='<a href="(.*?)" class="vervideo-lilink actplay">' obj = re.findall(reg_text,res.text) # findall(pattern, string, flags=0) 第一个参数匹配的内容,第二个是要查找的字符串 print(obj) # 查找出来是一个列表,拿出来的是一个个的连接地址 for url in obj: url = 'https://www.pearvideo.com/'+url res1 = requests.get(url) obj1 = re.findall('srcUrl="(.*?)"',res1.text) # print(obj1) # print(obj1[0]) # 列表循环取值 ,循环依次向列表中添加,此时是索引位0号位,此时添加到该位置后,紧接着取出来, # 所以每次循环出来的值都被该次取走,添加一个,取一个,添加一个,取走一个,所以是[0] name = obj1[0].rsplit('/',1)[1] # 1 小括号表示切1次(从右向左) print(name) res2 = requests.get(obj1[0]) print(res2) # 拿到返回的Response, with open(name,'wb')as f: for line in res2.iter_content(): # 获取二进制数据 f.write(line)
二 爬虫的流程
发送请求=》获取响应内容=》解析数据=》数据保存
#1、发起请求 使用http库向目标站点发起请求,即发送一个Request Request包含:请求头、请求体等 #2、获取响应内容 如果服务器能正常响应,则会得到一个Response Response包含:html,json,图片,视频等 #3、解析内容 解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等 解析json数据:json模块 解析二进制数据:以b的方式写入文件 #4、保存数据 数据库 文件
三 请求与响应
#http协议:http://www.cnblogs.com/linhaifeng/articles/8243379.html #Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server) #Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等) #ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
四 Request1,请求方式: 常用请求方式:GET, PO 其他请求方式:HEAD,PUT,DELETE,OPTHONS
requests 模拟发送http请求的模块 在不知道requests模块之前,js语言发送请求用的是ajax发送,它与python中的requests模块发请求的本质是一样的,都是发送http请求拿到数据 不同之处只不过是一个是javascript发送的,一个是python发送的,同理,其他语言中也会有相应的模块去发送http请求 jqurey只是把js进行封装了,在发送http请求时,封装成了ajax,也可以用原生的js发送
移动端向服务端发送请求,也是http请求 安卓:就得用java写 ios:用oc写,与c语言还不太一样 所以其他语言也有模拟http请求的模块,内置的,或者第三方的,但是必须要有 requests模块不管做爬虫,在做web项目或者服务也需要它 requests模块使用,是基于urllib封装之后的模块,更加好用 urllib 是python内置的模块,也是模拟发送http请求的库 # 模拟http请求,get,post,put,delete....
PS: post请求与get请求最终会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz post请求的参数放在请求体内: 可用浏览器查看,存放于form data 内 get请求的参数直接放在url后2,请求URL URL 全称统一资源定位符,如一个网页文档,一张图片,一个视频等都可以用url唯一来确定 url编码 https://www.baidu.com/s?wd=图片3,请求头 User-agent:请求头中如果没有user-agent客户端配置, 服务端可能将你当做一个非法用户 host cookies:cookie用来保存登录信息
一般做爬虫都会加上请求头
#4、请求体 如果是get方式,请求体没有内容 如果是post方式,请求体是format data ``` ps: 1、登录窗口,文件上传等,信息都会被附加到请求体内 2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post
```