爬虫day03,笔记

内容回顾

  • 正则表达式

    '''
    利用一些特殊符号的组合去字符串中筛选出符合条件的数据
    '''
    字符组
    	[0-9]
    	[a-z]
    特殊符号
    	.
       	\w
        \d
        ^
        $
        [^]
        ()
    量词
    	正则符号默认都是单个单个匹配,量词的出现可以匹配多个
        并且量词一定要跟在表达式的后面,不能单独使用
        *		0次或多次
        +		1次或多次
        ?		0次或一次
        {n}		n次
        {n,}	n次或多次
        {n,m}	n次到m次
    '''
    正则表达式默认都是贪婪匹配即:尽可能多的匹配
    '''
    正则案例
    
    贪婪匹配与非贪婪匹配
    	.*
        .*?
    '''
    问号跟在量词后面表示取消贪婪匹配变为非贪婪匹配
    '''
    
    总结
    	我们以后可能不需要自己手写一些复杂的正则表达式,但是我们要做到能够看得懂即可,一些复杂的直接百度搜索
    
  • python中使用正则

    可以借助于内置模块(自动给你下载好了,不需要你再次下载)
    re
    
    import re
    re.findall()
    re.serach()
    re.match()
    
  • 爬虫模块

    requests模块
    
    pip3 install requests
    	1.报错信息里面有类似于timeout关键字,那么仅仅是你网速不稳定的原因,继续重新执行
        2.第二种情况可能是你的pip版本过低,会自动给你一个更新pip的命令,你只需要拷贝执行即可
        python -m pip --upgrade  # 类似于这样的命令
        
    基本使用
    # 能够模拟浏览器朝服务端发送各式各样的请求
    import requests
    requests.get(url)  # 朝网址发送get请求获取数据
    
    基本防爬策略
    	1.服务端会校验当前请求的请求首行里面有没有作为浏览器的特殊标识
    		User-agent:...
                
    破解基本防爬策略1
    	在我们的请求里面加上请求头数据
        request.get(url,headers={'User-agent':'...'})
     
    常用方法
    	res = request.get(url,headers={'User-agent':'...'})
        # 获取网页字符串数据
        res.text
        # 获取网页二进制数据
        res.content
        # 获取响应状态码
        res.staus_code
        # 设置字符编码
        res.encoding='utf8'
    

今日内容

  • requests模块

  • cookie与session

  • requests爬取网址数据实战

  • json格式数据

    requests模块

    get请求如何携带参数
    url?username=jason&hobby=read
    requests模块如何携带
    	import requests
    
    	res = requests.get('https://www.baidu.com/s',
                       params={
                           'wd': '美女'
                       },
                       headers={
                           'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36',
                       }
                       )
    with open(r'mn1.html', 'wb') as f:
        f.write(res.content)
    """
    总结:大部分网址基本上都会校验你是否是个浏览器,所以我们以后在发送请求的时候最后将User-agent携带着
    """
    

cookie与session

cookie与session都是用来记录当前用户状态的
二者产生的原因在于HTTP协议是无状态的

cookie的由来
	就是保存在浏览器上面的k:v键值对

session的由来
	就是保存在服务端上面的数据
'''
在互联网中没有绝对意义上的安全
'''
两者工作机制
	session的工作需要依赖于cookie
    
总结:
    只要是需要保存用户状态的网址,都需要借助于cookie
    浏览器可以选择保存cookie也可以选择拒绝
    一旦浏览器拒绝保存cookie,那么所有网址的登录都无法进行

知识扩展:https://www.cnblogs.com/Dominic-Ji/p/10886902.html

携带cookie

res = requests.get/post/...(
	url='',
    headers={},
    params={},
    cookies={}
)

案例:华华手机登录  http://www.aa7a.cn/user.php
'''
验证是否登录 我们可以采用返回界面数据右上角是否含有用户名
'''
1.先研究登录请求发送的地址和数据格式
2.找到请求体数据格式 直接拿走
	username: weqeqw
    password: wqewqewqe
    captcha: CA3V
    remember: 1
    ref: http://www.aa7a.cn
    act: act_login
3.自己模拟post请求发送
4.如果用户名和密码正确 服务端就会给你返回标识你身份的cookie信息
	我们只需要获取到服务端给我们返回的cookie数据以后就可以拿着cookie无限制登录访问
 
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36',
}

res = requests.post('http://www.aa7a.cn/user.php',
                    headers=headers,
                    # post请求携带数据需要使用data参数
                    data={
                        'username': '616564099@qq.com',
                        'password': 'lqz123',
                        'captcha': 'CA3V',
                        'remember': '1',
                        'ref': 'http://www.aa7a.cn',
                        'act': 'act_login'
                    }
                    )
# 获取服务端返回的cookie数据
cookie=res.cookies.get_dict()

# 携带着cookie访问网址首页 验证是否是登录状态
res = requests.get('http://www.aa7a.cn/user.php',
                   headers=headers,
                   cookies=cookie
                   )
if '616564099@qq.com' in res.text:
    print('登录成功')
else:
    print('用户名或密码错误')

当需要爬取大量数据

#stream参数:一点一点的取,比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的

import requests

response=requests.get('https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo-transcode/1767502_56ec685f9c7ec542eeaf6eac93a65dc7_6fe25cd1347c_3.mp4',
                      stream=True)

with open('b.mp4','wb') as f:
    for line in response.iter_content():
        f.write(line)

json格式数据

'''json格式数据是前端和后端通用的一种格式,用来打破语言限制实现无障碍数据沟通交流'''
json格式的数据跟我们python里面的字典长得非常的像
只不过json格式引号都是双引号
双引号是json格式数据的标识

# import json
d = {'username':'jason','password':'123'}
# 将数据转换成json格式(想给别人发数据)
res = json.dumps(d)   # 将字段转换成json格式的字符串
print(res,type(res))
# 将json格式数据转换成python数据(别人给你发数据)
res1 = json.loads(res)  # 将json格式字符串转换成字典
print(res1,type(res1))

IP代理池、Cookie池

IP代理池

防爬措施
1.服务端可以获取到每个客户端的IP地址
	规定一个IP地址在一定的时间范围内不得访问超出规定次数的请求
    如果超出了直接对该IP地址做访问限制(一定时间内,终身封禁)
破解措施
使用IP代理池
	给你提供很多IP每次从中随机获取一个去访问服务端,避过次数校验
#代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
proxies={
    'http':'183.166.161.14:4226',
    'http':'115.209.120.210:4226',
    'http':'119.178.168.138:4245',
}
respone=requests.get('https://www.12306.cn',
                     proxies=proxies)

print(respone.status_code)

Cookie池
规定一个Cookie在一定的时间范围内不得访问超出规定次数的请求
    如果超出了直接对该Cookie做访问限制(一定时间内,终身封禁)
破解措施
使用Cookie代理池
	给你提供很多Cookie每次从中随机获取一个去访问服务端,避过次数校验
    
先在某一个网址用很多用户名和密码登录获取每一次的cookie
然后存储到一个文件中
之后访问该网址随机从文件中获取一个cookie去访问

上传文件

import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',
                      files=files
                     )
print(respone.status_code)

爬取梨视频

1.先研究查看更多按钮对应的内部规律
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=36&mrd=0.7789724307502175&filterIds=1707503,1707504,1707449,1707440,1707451,1706501,1707459,1707430,1707456,1707388,1707434,1707433,1707439,1707435
    
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=48&mrd=0.7789724307502175&filterIds=1707503,1707504,1707449,1707440,1707451,1706501,1707459,1707430,1707456,1707388,1707434,1707433,1707439,1707435
    
2.在查找页面规律的时候可以使用查看网页源代码的形式
import requests
import re

res = requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')
# 筛选出视频的链接地址
# <a href="video_1707503" class="vervideo-lilink actplay">

reg_text='<a href="(.*?)" class="vervideo-lilink actplay">'
res1 = re.findall(reg_text,res.text)  # 只能获取到视频的后缀
# 还需要加上地址前缀
for url in res1:
    real_url = 'https://www.pearvideo.com/' + url
    # print(real_url)  # 获取到了视频所在的页面  里面有很多我们不需要的
    # 朝上述地址发送get请求 从获取到的含有视频数据的页面中筛选出视频链接
    print(real_url)

posted @ 2020-11-19 00:21  zmh。  阅读(145)  评论(0)    收藏  举报