学习爬虫第一天
import requests
import re
response = requests.get('https://www.pearvideo.com/')
print(response.text)
res_list = re.findall('a href="video_(.*?)"',response.text,re.S)
print(res_list)
for v_id in res_list:
detail_url = 'https://www.pearvideo.com/video_'+v_id
print(detail_url)
response = requests.get(url=detail_url)
# print(response.text)
video_url = re.findall('srcUrl="(.*?)"',response.text,re.S)[0]
print(video_url)
video_name = re.findall(
'<h1 class="video-tt">(.*?)</h1>',response.text,re.S)[0]
print(video_name)
v_response = requests.get(video_url)
with open('%s.mp4' % video_name,'wb') as f:
f.write(v_response.content)
print(video_name,'视频爬取完成')
1、什么是互联网?
互联网其实是由一堆网络设备(比如: 网线、路由器、交换机、防火墙等等...)与一台台的计算机连接而成,就像一张蜘蛛网一样。
2、互联网建立的目的
互联网的核心价值: 数据是存放在一台台计算机中的,而互联网是把计算机互联到一起,也就是说把一台台计算机中的数据都捆绑到一起了,目的就是为了能够方便每台计算机彼此之间数据的传递与数据的共享,否则你只能拿到U盘或者是移动硬盘去别人的计算机上拷贝数据了。
3、什么是上网?
上网其实指的是有用户端(客户端)的计算机向目标计算机发送请求,将目标计算机的数据下载到客户端计算机的过程。
- 普通用户获取数据的方式:
浏览器提交请求 ---> 下载页面代码 ---> 解析/渲染成页面。 - 爬虫程序获取数据的方式:
模拟浏览器发送请求 ---> 下载页面代码 ---> 只提取有用的数据 ---> 存放于数据库中或文件中。 - 普通用户与爬虫程序的区别:
- 普通用户: 普通用户是通过打开浏览器访问网页,浏览器会接收所有的数据。
- 爬虫程序: 爬虫程序只提取网页代码中对我们有价值的数据。
- 爬虫的基本流程其实就是模拟浏览器往目标站点发送请求,那浏览器发送的是http协议数据格式的请求,http协议的底层其实就是TCP协议数据格式。其实浏览器是一个套接字客户端,访问的目标站点是一个套接字服务端。那套接字客户端要与套接字服务端建立链接,得先拿到 ”客户端的ip和端口“ 与 ”服务端的ip和端口“ ,然后套接字客户端才向套接字服务端发送一次connection的请求,通过三次握手建立双向链接,此时形成了两条管道,一条是客户端往服务端发送数据的管道,另一条是服务端接收到请求后把数据返回给客户端的管道。那浏览器会沿着第一条管道往服务端发送的http协议的请求,服务端会把响应数据打包成http协议的数据格式,沿着第二条管道返回给客户端。这就是爬虫的基本流程。
- 普通用户: 普通用户是通过打开浏览器访问网页,浏览器会接收所有的数据。
- 普通用户获取数据的方式:
介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
#注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求
#安装:pip3 install requests
#各种请求方式:常用的就是requests.get()和requests.post()
>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')
二 基于GET请求
1、基本请求
import requests
response=requests.get('http://dig.chouti.com/')
print(response.text)
2、带参数的GET请求->params
自己拼接GET参数
params参数的使用3、带参数的GET请求->headers
#通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常见的有用的请求头如下
Host
Referer #大型网站通常都会根据该参数判断请求的来源
User-Agent #客户端
Cookie #Cookie信息虽然包含在请求头里,但requests模块有单独的参数来处理他,headers={}内就不要放它了
View Code4、带参数的GET请求->cookies
View Code三 基于POST请求
1、介绍
#GET请求
HTTP默认的请求方法就是GET
* 没有请求体
* 数据必须在1K之内!
* GET请求数据会暴露在浏览器的地址栏中
GET请求常用的操作:
1. 在浏览器的地址栏中直接给出URL,那么就一定是GET请求
2. 点击页面上的超链接也一定是GET请求
3. 提交表单时,表单默认使用GET请求,但可以设置为POST
#POST请求
(1). 数据不会出现在地址栏中
(2). 数据的大小没有上限
(3). 有请求体
(4). 请求体中如果存在中文,会使用URL编码!
#!!!requests.post()用法与requests.get()完全一致,特殊的是requests.post()有一个data参数,用来存放请求体数据
2、发送post请求,模拟浏览器的登录行为
#对于登录来说,应该输错用户名或密码然后分析抓包流程,用脑子想一想,输对了浏览器就跳转了,还分析个毛线,累死你也找不到包
自动登录github(自己处理cookie信息)
requests.session()自动帮我们保存cookie信息3、补充
View Code四 响应Response
1、response属性
import requests
respone=requests.get('http://www.jianshu.com')
# respone属性
print(respone.text)
print(respone.content)
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.cookies.items())
print(respone.url)
print(respone.history)
print(respone.encoding)
#关闭:response.close()
from contextlib import closing
with closing(requests.get('xxx',stream=True)) as response:
for line in response.iter_content():
pass
2、编码问题
View Code3、获取二进制数据
import requests
response=requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509868306530&di=712e4ef3ab258b36e9f4b48e85a81c9d&imgtype=0&src=http%3A%2F%2Fc.hiphotos.baidu.com%2Fimage%2Fpic%2Fitem%2F11385343fbf2b211e1fb58a1c08065380dd78e0c.jpg')
with open('a.jpg','wb') as f:
f.write(response.content)
获取二进制流4、解析json
View Code5、Redirection and History
先看官网的解释
利用github登录后跳转到主页面的例子来验证它五 高级用法
1、SSL Cert Verification
View Code2、使用代理
View Code3、超时设置
View Code4、 认证设置
View Code5、异常处理
View Code6、上传文件
View Code


浙公网安备 33010602011771号