博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day02-爬虫入门
阅读量:5108 次
发布时间:2019-06-13

本文共 8876 字,大约阅读时间需要 29 分钟。

一、请求百度翻译(post方式)

  问题来源
    百度翻译电脑网页版所带请求中包含js生成的sign,所以改用手机版网页访问,可以简单构造
  构造请求
    requests.post(post_url,post_data,headers=headers)
  实现构造
    headers={'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36'}
    post_data={
      'query':query_string,
      'from':'zh',
      'to':'en',
      }
    post_url = 'https://fanyi.baidu.com/basetrans'
    ret = requests.post(post_url,data=post_data,headers=headers)

1 import requests 2 import json 3  4 query_string = input('请输入中文:') 5  6 # post请求 7 headers={
'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36'} 8 post_data={ 9 'query':query_string,10 'from':'zh',11 'to':'en',12 }13 post_url = 'https://fanyi.baidu.com/basetrans'14 15 ret = requests.post(post_url,data=post_data,headers=headers)16 print(ret.content.decode()) # 需要json处理17 print(json.loads(ret.content.decode()))18 print(json.loads(ret.content.decode())['trans'][0]['dst'])
View Code

二、使用代理

  代理作用

    让服务器以为不是同一个客户端在请求
    防止我们的真实地址被泄露,防止被追究
  没有代理
    浏览器——————>服务器
  反向代理
    浏览器——————>nginx——————>服务器
  正向代理
    浏览器——————>代理——————>服务器
  代理使用
    用法
      requests.get(url,proxies=proxies)
      proxies的形式:字典
      proxies={
        ‘http’:‘http://12.34.56.79:9527’
      }
  代理资源
    https://proxy.mimvp.com/freesecret.php
    https://proxy.coderbusy.com/

1 import requests 2  3 p = { 4     'http':'http://113.73.65.121:7153' 5 } 6 headers = { 7     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36' 8 } 9 10 ret = requests.get('http://www.baidu.com',headers=headers,proxies=p)11 print(ret.status_code)
View Code

  使用注意

    准备一堆的ip地址,组成ip池,随机选择一个ip来用

    如何随机选择代理ip,让使用次数较少的ip地址有更大的可能性被用到
      {'ip':ip,'times':0}
      [{},{},{},{}],对以上ip放入列表,对列表进行排序,按照使用次数排序
      选择使用次数较少的10个ip,从中随机选取一个
    检查ip的可用性
      可以使用requests添加超时参数,判断ip地址的质量
      在线代理ip质量检测网站

三、cookie和session

  区别
    cookie数据存放在客户端的浏览器上,session数据放在服务器上
    cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
    session会在一定时间内保存在服务器上,当访问增多,会占用服务器的性能
    单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
  爬虫
    带上cookie、session的好处
      能够请求到登录之后的页面
    带上cookie、session的弊端
      一套cookie和session往往和一个用户对应
    请求太快,请求次数太多,容易被服务器识别为爬虫
    注意
      不需要cookie的时候尽量不去使用cookie
      但是为了获取登录之后的页面,我们必须发送带有cookie的请求
    使用
      携带一堆cookie进行请求,把cookie组成cookie池
    requests提供的session
      requests提供了一个叫session类,来实现客户端和服务端的会话保持
      使用方法:
        1.实例化一个session对象
        2.让session发送get或者post请求
          session=requests.session
          response=session.get(url,headers)
  请求登录之后的网站的思路(使用requests)
    实例化session
    先使用session发送请求,登录网站把cookie保存在session
    再使用session请求对应的网站,session能够自动的携带登录成功时保存在其中的cookie进行请求
  不发送post请求,使用cookie获取登陆后的页面
    cookie过去时间很长的网站
    在cookie过期之前能够拿到所有的数据,比较麻烦
    配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
  三种登录方式
    实例化session,使用session发送post请求,再使用它获取登录后的页面
    headers中添加cookie键,值为cookie字符串
    在请求方法中添加cookies参数,接收字典形式的cookie。字典形式的cookie中的键是cookie的name,值是cookie的value

1 import requests 2  3  4 ######### 实例化session ######### 5  6 session = requests.session() 7 post_url = 'http://www.renren.com/PLogin.do' 8 # 注意这里登录所找的地址,是在form表单中找到的 9 post_data = {10     'email':'13061455882',11     'password':'714466'12 }13 14 headers = {15     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'16 }17 # 使用session发送post请求,cookie保存在其中18 session.post(post_url,headers=headers,data=post_data)19 # 再使用session进行请求登录之后才能访问的地址20 ret = session.get('http://www.renren.com/969010233/profile',headers=headers)21 # 保存页面22 with open('renren1.html','w',encoding='utf-8') as f:23     f.write(ret.content.decode())24 25 26 27 '''28 ######### 直接找到cookie #########29 headers ={30     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',31     'Cookie':'p005baksess=18e345f691fb6a301bb064fd093c9d80d48e7545'32 }33 34 ret = requests.get('https://p013.zhenlutech.com/index.php/admin',headers=headers)35 with open('admin.html','w',encoding='utf-8') as f:36     f.write(ret.content.decode())37 '''38 39 40 '''41 ######### 传入cookie #########42 43 44 headers = {45     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'46 }47 48 cookies = 'anonymid=jp9m917q-35ny33; depovince=SD; _r01_=1; JSESSIONID=abcZF4nEVWnOPeRBv04Dw; ick_login=de6c9926-372d-4a35-aacd-0dcb7d1253fb; jebecookies=16ef79e7-76b7-4aa8-8014-34a30ea13eb2|||||; _de=FCDB90B914A526660E0B69E00FD48194; p=6bed82a76eef3b37a31d84c21b1ee0ec3; first_login_flag=1; ln_uact=13061455882; ln_hurl=http://head.xiaonei.com/photos/0/0/men_main.gif; t=f03bbd03c6c2cf9d0700aedcff9944d03; societyguester=f03bbd03c6c2cf9d0700aedcff9944d03; id=969010233; xnsid=86d166c9; loginfrom=syshome; ch_id=10016; jebe_key=95c30273-9252-4373-adab-c3adda9c5db1%7C21a3b51c0c3373888942d7937b020f92%7C1543926359197%7C1%7C1543926520005; wp_fold=0'49 cookies = {i.split('=')[0]:i.split('=')[1] for i in cookies.split('; ')}50 # 注意split知识点,将字符串切割为字典51 print(cookies)52 ret = requests.get('http://www.renren.com/969010233/profile',headers=headers,cookies=cookies)53 with open('renren.html','w',encoding='utf-8') as f:54     f.write(ret.content.decode())55 '''
View Code

  寻找登录的post地址

    在form表单中寻找action对应的url地址

      post的数据是input标签中name的值作为键,真正的用户名密码作为值的字典,post的url地址就是action对应的url地址
    抓包
      寻找登录的url地址
      勾选preserve log按钮,防止页面跳转找不到url
      寻找post地址,确定参数
        参数不会变,直接用,比如密码不是动态加密的
        参数会变
          参数在当前的响应中
          通过js生成
    定位到想要的js
      选择会出发js时间的按钮,点击event listener,找到js的位置
      通过chrome中的search all file来搜索url中关键字
      添加断点的方式来查看js操作,通过python来进行同样的操作

四、requests模块

  入门
    requests的底层实现就是urllib
    requests在python2和python3中通用,方法完全一样
    requests简单易用
    requests能够自动帮助我们解压(gzip压缩的等)网页内容
    文档学习地址:http://docs.python-requests.org/zh_CN/latest/
  编解码
    response.content.decode()
    response.content.decode('utf-8')
    response.text
  response.text和response.content的区别
    response.text
      类型:str
      解码类型:根据HTTP头部对响应的编码作出有根据的推测,推测的文本编码
      如何修改编码方式:response.encoding=‘gbk’
    response.content
      类型:bytes
      解码类型:没有指定
      如何修改编码方式:response.content.decode('utf-8')
    推荐使用response.content.decode()的方式获取响应的html页面
    练习保存图片

1 import requests2 3 resposne = requests.get('http://docs.python-requests.org/zh_CN/latest/_static/requests-sidebar.png')4 5 with open('a.png','wb') as f:6     f.write(resposne.content)
View Code

  requests小技巧

    requests.util.dict_from_cookiejar() 把cookie对象转化为字典
    请求SSL证书验证
      response=request.get('https://www.12306.cn/mornhweb/',verify=False)
    设置超时
      response=requests.get(url,timeout=10)
    配合状态码判断是否请求成功
      assert response.status_code==200
    示例:

1 import requests 2  3 ''' 4 response = requests.get('http://www.baidu.com') 5 print(response.cookies) # 
]> 6 print(requests.utils.dict_from_cookiejar(response.cookies)) # {'BDORZ': '27315'} 7 8 print(requests.utils.cookiejar_from_dict({'BDORZ': '27315'})) 9 10 print(requests.utils.unquote('https://tieba.baidu.com/f?ie=utf-8&kw=%E6%9D%8E%E6%AF%85'))11 print(requests.utils.quote('https://tieba.baidu.com/f?ie=utf-8&kw=李毅'))12 '''13 14 '''15 # 异常处理16 headers ={'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36'}17 18 def _parse_url(url):19 response = requests.get(url,headers=headers,timeout=3)20 assert response.status_code == 200 # 上下两个都可能报错,所以捕获异常21 return response.content.decode()22 23 def parse_url(url):24 try:25 html_str = _parse_url(url)26 except:27 html_str = None28 return html_str29 30 if __name__ == '__main__':31 post_url = ('https://www.baidu.com/')32 print(parse_url(post_url))33 '''34 35 36 # 因为请求的url可能多,比如请求1000个url,难免某个url会出现问题,那么引入retry模块,让请求多次执行37 from retrying import retry38 39 headers ={
'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36'}40 41 @retry(stop_max_attempt_number=3)42 # 在源码中找到参数,表示重复请求进行三次43 def _parse_url(url):44 print('*'*20) # 判断一下是否重复了三次45 response = requests.get(url,headers=headers,timeout=3)46 assert response.status_code == 20047 return response.content.decode()48 49 def parse_url(url):50 try:51 html_str = _parse_url(url)52 except:53 html_str = None54 return html_str55 56 if __name__ == '__main__':57 post_url = ('www.baidu.com/')58 print(parse_url(post_url))
View Code

 

转载于:https://www.cnblogs.com/xuedingwangluo/p/10069672.html

你可能感兴趣的文章
Java IO
查看>>
浏览器的解析原理
查看>>
NetFPGA-1G-CML从零开始环境配置
查看>>
html相关操作点
查看>>
BigDecimal的String类型
查看>>
C# 实现脚本辅助功能
查看>>
要在c++里打印??=需要拆开么?
查看>>
闪存备份,记录平时一些小随笔
查看>>
Android轻量级ORM框架ActiveAndroid入门教程(转)
查看>>
动态设置和访问cxgrid列的Properties(转)
查看>>
高通董事长:努力降低智能手机价格
查看>>
PL/SQL Developer 9.0 beta发布!
查看>>
hadoop分布式配置(服务器系统为centos5,配置时使用的用户是root)
查看>>
超越MySQL:三个流行MySQL分支的对比
查看>>
找出文档库里最多被浏览的文档
查看>>
[JLOI 2013]卡牌游戏
查看>>
[HNOI 2017]单旋
查看>>
吴清忠养生网
查看>>
360的流氓新招
查看>>
LeetCode_链表操作1—Swap Nodes in Pairs
查看>>