当前位置: 首页 > article >正文

Python爬虫基础——requests模块

        注意不要影响人家服务器,记得请求速度要慢些,可以适当延时,不要发人家服务器累趴了,这就有些过分了。爬虫需谨慎,可以学习,有所爬有所不爬,不要违规操作,这是我学习爬虫所看到每一本书的提示,这里提示给各位小伙伴!!!!!!!!!!!!

1、requests模块获取数据的方式

        发起网络请求主要使用requests模块中的get()函数和post()函数,get()函数的功能是向服务器发起获取网页的请求,获取到相应对象可以被缓存到浏览器中,该函数只获取资源,不会在服务器中执行修改操作,而post()函数的功能是向服务器传送数据,服务器会根据这些数据做出响应,所以post()函数常用来模拟用户登录。

1.1 获取静态网页的源代码

        静态网页是指设计好后内容就不再变动的网页,所有用户访问该网页时看到的页面效果都一样,对于这种页面可以直接请求源代码,然后对源代码进行数据分析,就能获取想要的数据。

import requests                                         #导入requeste模块
response = requests.get(url="https://www.baidu.com")    #使用get()函数对由参数url指定的网页地址发起请求,并返回一个响应对象
print(response.text)
'''
运行结果:
响应对象分为响应头部和响应体两部分,响应头部包含响应的状态码、日期、内容类型和编码格式等信息,响应体则包含字符串
形式的网页源代码,这里将返回的响应对象存储到变量response中,使用对象的txt属性提取响应对象中的网页源代码字符串,
然后使用print()函数进行输出,以便于去欸顶网页源代码是否获取成功
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>ç¾åº¦ä¸ä¸ï¼ä½ å°±ç¥é</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=ç¾åº¦ä¸ä¸ class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>æ°é»</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>å°å¾</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>è§é¢</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>è´´å§</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>ç»å½</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">ç»å½</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">æ´å¤äº§å</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>å³äºç¾åº¦</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使ç¨ç¾åº¦åå¿è¯»</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>æè§åé¦</a>&nbsp;京ICPè¯030173å·&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
'''

1.2  获取动态加载的数据

        动态网页是指服务器返回一个网页模板,其数据通过Ajax或其他方式填充到模板的位置,我们想要的数据一般都在服务器返回的JSON格式数据包中。

import requests
import time
headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36 Edg/131.0.0.0"}        #浏览器身份验证
url = "https://movie.douban.com/j/chart/top_list"       #请求的地址
params = {"type":"25","interval_id":"100:90","action":" ","start":"0","limit":"1"}     #需要携带的动态参数
response = requests.get(url,headers=headers,params=params)
time.sleep(1)
print(response.json())
'''
运行结果:
[{'rating': ['9.4', '50'], 'rank': 1, 'cover_url': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg', 'is_playable': False, 'id': '1291561', 'types': ['剧情', '动画', '奇幻'], 'regions': ['日本'], 'title': '千与千寻', 'url': 'https://movie.douban.com/subject/1291561/', 'release_date': '2019-06-21', 'actor_count': 43, 'vote_count': 2399849, 'score': '9.4', 'actors': ['柊瑠美', '入野自由', '夏木真理', '菅原文太', '中村彰男', '玉井夕海', '神木隆之介', '内藤刚志', '泽口靖子', '我修院达也'], 'is_watched': False}]
'''

2、批量获取带页数图片

        先用get()函数获取响应对象,然后使用content属性来提取图片的二进制节码。截至目前位置,这个网址可以正常爬取,当然也支持一张一张下载,我只是做壁纸嫌麻烦。

'''
先用get()函数获取响应对象,然后使用content属性来提取图片的二进制节码
'''
import requests
import parsel
'''
https://haowallpaper.com/?page=1&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40
https://haowallpaper.com/?page=2&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40&isSel=true
https://haowallpaper.com/?page=3&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40&isSel=false
https://haowallpaper.com/?page=4&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40&isSel=true
https://haowallpaper.com/?page=5&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40&isSel=false
'''
# for page in range(1, 10+1):
for page in range(1, 108 + 1):
    print(f'==========================爬取第{page}页')
    if page == 1:
        #获取数据对应的链接
        url=f"https://haowallpaper.com/?page={page}&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40"
    elif    page/2 == 0:
        url = f"https://haowallpaper.com/?page={page}&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40&isSel=true"
    else:
        url = f"https://haowallpaper.com/?page={page}&sortType=3&rows=9&isFavorites=false&typeId=35c203f75643ac7803b8f706fa91ef40&isSel=false"
    #准备一个请求的伪装,User-Agent代表浏览器身份识别
    header={"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"}
    #python发送指定地址请求
    response = requests.get(url,headers=header)
    # print(response)           #查看是否请求成功200成功,404或者403,505表示请求失败
    html = response.text        #取对象的文本数据,字符串-->正则表达式
    # print(html)
    #解析数据(解析出自己的想要数据)
    selector = parsel.Selector(html)       #转化数据类型
    list = selector.xpath("//div[@class='homeContainer']/div[@class=\'card\']/img")

    for li in list:
        photo_title = li.xpath('./@title').get().split('-')[1]
        photo_rul = li.xpath('./@src').get().split('getCroppingImg')
        photo_rul = photo_rul[0]+"previewFileImg"+photo_rul[1]
        #print(photo_title, photo_rul)
# '''
# https://haowallpaper.com/link/common/file/previewFileImg/16089576883735936
# https://haowallpaper.com/link/common/file/getCroppingImg/16089576883735936
# '''
        #请求视频数据 视频、图片、音频都属于二进制数据
        photo_data = requests.get(url = photo_rul, headers = header).content      #提取二进制数据
        #数据保存
        with open('video\\'+photo_title+'.jpg', 'wb') as f:
            f.write(photo_data)
            print("保存完成",photo_title)
    time.sleep(4)

3、get()函数的介绍

        网上有许多介绍的,这里我只是简单做一个笔记。

3.1        headers()函数        

        一种伪装方式。很多网站服务器为了防止他人爬取数据,会对发起请求方的身份及进行身份验证,主要手段就是请求包的请求头的User-Agent信息,该信息描述了请求方的身份。

3.2        params

        主要用于发送请求时携带动态参数,例如在搜索引擎中会将玉壶在搜索框中输入的关键词作为参数发送给服务器,共服务器获取相关网页。

3.3        timeout

        用于设置请求超时的时间。由于网络,或者其他原因,并不是每次请求都能成功。resquest模块会多次发送请求,可以适当设置参数timeout的值(单位为秒),可以在超出请求时间时抛出异常,结束程序。

response = resquests.get(url = 'https://www.sogou.com/web',timeout =1.0 )

3.4        proxies

        用于设置代理服务器。网站服务器在收到请求的同时还会获得对方请求的网址,当服务器检测到短时间内同意请求地址时会认为对方是爬虫程序,进行限制。

headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"}
proxies = {"http": "http://113.125.156.47:8888"}
url = "https://pic.netbian.com/4kmeinv/index.html"
res = requests.get(url, headers=headers, proxies=proxies)
print(res)

http://www.kler.cn/a/468479.html

相关文章:

  • 打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程
  • (已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型
  • ArcGIS Server 10.2授权文件过期处理
  • v-model与 mvvm 回顾
  • 如何使用 Ansys OptiSlang 同时运行多个参数化设计研究
  • 【shell编程】报错信息:Non-zero Exit Status(包含7种解决方法)
  • Harmony OS开发-ArkTS语言速成五
  • 嵌入式Linux(二)·配置VMware使用USB网卡连接STM32MP157实现Windows、Ubuntu以及开发板之间的通信
  • 基于海思soc的智能产品开发(camera sensor的两种接口)
  • React中的合成事件
  • 源代码编译安装X11及相关库、vim,配置vim(2)
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)
  • SpringCloud源码-Ribbon
  • Python爬虫基础——案例:爬取豆瓣电影动画排行榜
  • 蓝桥杯备赛:C++基础,顺序表和vector(STL)
  • Zabbix5.0版本(监控Nginx+PHP服务状态信息)
  • Earth靶场
  • SQL 基础教程 - SQL UPDATE 语句
  • [python3]Excel解析库-calamine,10倍openpyxl性能
  • 19.3、Unix Linux安全分析与防护
  • MongoDB相关使用问题
  • ansible-Ad-hoc命令行模式
  • java 字典表加载内存
  • Bash Shell的操作环境
  • NLP中特征提取方法的总结
  • 使用javacv获取海康威视rtsp流的详细教程