爬虫 404 try_Python爬虫MOOC笔记

写在前面的小于碎碎念

最近在学习Python爬虫内容,其实很多知识在网上搜索一下都能查到,但是作为自己的一种学习记录,也是回顾与复习呀。

这种东西真的变化超级快,以前可以直接爬取的内容,现在很多网站都增加了反爬机制,报错家常便饭TAT,常常觉得自己是bug生产机,不过毕竟前人栽树后人乘凉,大多数问题都可以通过检索得到解决,能成功解决问题也是成就感的来源之一呢~

总结来说爬虫是从网络获取信息、解析信息并最终输出为需要格式的过程。

说起来也挺有意思的,用公众号顺带掌握了一波公共号排版和插入代码的小技巧哈哈。好啦,那我们一起开始叭!

以下内容主要来源于中国大学MOOC--Python网络爬虫与信息提取--北京理工大学。仅供个人学习使用。(代码部分可右滑阅读全部内容)

需要有Python基础知识才能看懂哦~不然就跟第一次接触的我一样,全程听天书QAQ

思维导图

5827298a7e0aaeacf2c338c1f9d91585.png

第一周 网络爬虫规则

1.1Request库入门

Request库的安装

需要安装request库,判断安装情况:code返回200说明成功

 import requests
r = requests.get("https://www.baidu.com")
print(r.status_code)
r.encoding = 'utf-8'
print(r.text)
request库7个主要方法
方法说明
requests.request()构造一个请求,支撑以下个方法的基础方法
requests.get()获取HTML网页的主要方法,对应于HTTP的GET
requests.head()获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post()向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put()向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete()向HTML网页提交局部删除请求,对应于HTTP的PDELETE

Request库的get()方法

r = request.get(url) 通过get(url)构造一个向服务器请求资源的Request对象 request.get是返回一个包含服务器资源的Response对象

完整形式

 r = request.get(url,params=None,**kwargs) 

url:拟获取页面的url链接 

(个人理解url是网页访问地址https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_URL)

params:url中的额外参数,字典或字节流格式,可选

**kwargs:12个控制访问的参数

response对象的属性
属性说明
r.status_codeHTTP请求的返回状态,200表示连接成功,404失败
r.textHTTP相应内容的字符串形式,即url对应的页面内容
r.encoding从HTTP header中猜测的响应内容编码方式
r.apparent_encoding从内容中分析的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制方式

r.status_code(200)→r.encoding/r.apparent_encoding/r.content

r.encoding: 若header中不存在charset,则认为编码为ISO-8859-1

个人理解,encoding是从head中charset部分提取得到的编码方式,而apparent_encoding是根据整体内容分析得到的编码方式,因此更为准确,但同时速度可能慢一些

爬取网页的通用代码框架

request库异常
异常说明
requests.ConnectionError网络连接错误异常,如DNS查询失败、拒绝连接等(仅限连接时的异常)
requests.HTTPErrorHTTP错误异常
requests.URLRequiredURL缺失异常
requests.TooManyRedirects超过最大重定向次数,产生重定向异常
requests.ConnectTimeout连接远程服务器超时异常
requests.Timeout请求URL超时,产生超时异常(整个过程)

 r.raise_for_status() 判断返回的类型是否是200,是的话说明返回内容正常,否则产生异常requests.HTTPError

通用代码框架:

import requests
def getHTMLTEXT(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"
url = "https://www.baidu.com"
print(getHTMLTEXT(url))

使得爬取网页更加稳定、有效、可靠

HTTP协议及Request库方法

HTTP,Hypertext Transfer Protocol,超文本传输协议。

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。用户发起请求,服务器做出响应。无状态指不同次数之间的访问没有相互关联。HTTP协议采用URL作为定位网络资源的标识。

URL格式:http://host[:port][path]

host:合法的Internet主机域名或IP地址

port:端口号,默认端口为80

path:内部路径

url是通过HTTP协议存取资源的一个路径(类似电脑中对应的文件夹路径,但此路径再Internet上),每一个url对应一个数据资源

(URL定义参考                    https://developer.mozilla.org/en-US/docs/Learn/Common_questions/What_is_a_URL)

方法说明
GET请求获取URL位置的资源
HEAD请求获取URL位置资源的头部信息
POST请求向URL位置的资源后附加新的数据
PUT请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE请求删除URL位置存储的资源

云端上的所有资源通过URL进行标识,通过GET\HEAD获得资源,通过PUT\POST\PATCH\DELETE对云端资源进行修改(每一次操作独立无状态的)

PATCH\PUT区别:

 用PATCH只需要改变一个地方的内容,PUT要将改变的内容及其他未改变内容一并提交。PATCH优点是节省网络带宽。HTTP协议与request库方法是一致的。

POST方法 提交列表,会默认进入form中;提交字符串,默认编码为data PUT类似

request库主要方法解析

向URL POST一个字典,自动编码为表单(form),POST一个字符串,自动编码为data

requests.request(method,url,**kwargs)

method:请求方式,对应get等7种

url:拟获取页面的URL链接

**kwargs:控制访问的参数,共13个

可选参数:
  • params:字典或字节序列,作为参数增加到url中 相当于筛选资源

  • data:字典、字节序列或文件对象,作为request的内容 理解是把内容存储到对应的url中

  • json:JSON格式的数据,作为内容部分可以向服务器提交

  • headers:字典,HTTP定制头 访问时的头字段 可以模拟浏览器向服务器中发起访问

  • cookies:字典或CookieJar,request中的cookie

  • auth:元组,支持HTTP认证功能

  • files:字典类型,传输文件 向链接提交文件

  • timeout:设定超时时间,以秒为单位

  • proxies:字典类型,设定访问相关的代理服务器,可以增加登录认证 例如访问百度时可以采用代理服务器的地址,隐藏源地址(感觉有点像VPN的道理)

  • allow_redirects:True/False,默认为T,重定向开关 是否允许重定向

  • stream:True/False,默认为T,获取内容立即下载开关

  • verify:True/False,默认为T,认证SSL证书开关

  • cert:保存本地SSL证书路径的字段(不详细介绍)

小结:对网络爬取,主要关注get和head即可。

课后练习1:成功爬取网页100次并测试时间

import requests as rq
import time
def gethtml(url):
    try:
        r = rq.get(url)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r
    except:
        return '爬取失败'
if __name__ == '__main__': # 如果模块是被直接运行的,则代码块被运行,如果模块是被导入的,则代码块不被运行。
    start = time.perf_counter()
    url = 'http://baidu.com'
    for i in range(100):
        gethtml(url)
        end = time.perf_counter()
    print('一百次爬取时间为{:.2f}秒'.format(end-start)) #保留两位小数

time.perf_counter() # 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,

计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A算起,

课后练习2:获得GitHub的小图标

import requests as rq
r= rq.get("https://github.com/favicon.ico")
with open('favicon.ico','wb') as f: #favicon.ico,文件名称 wb 读写方式
    f.write(r.content)
wb以二进制格式打开一个文件只用于写入。open函数介绍https://www.runoob.com/python/python-func-open.html

用Session可以模拟同一个对话而维持cookies,常用于模拟登陆成功后的下一步操作。对显示证书错误的页面,可以通过设置verify参数为false,并用disable_warnings等方法屏蔽证书错误警告。可用proxies参数设置代理。

参考资料

作业代码参考https://developer.aliyun.com/article/637534

对time.perf_counter()理解https://www.runoob.com/note/35499

对if __name__ == '__main__'理解https://blog.konghy.cn/2017/04/24/python-entry-program/?spm=a2c6h.12873639.0.0.7928184dD8jlCj

对format函数的理解https://www.runoob.com/python/att-string-format.html

排版 135编辑器

代码在线编辑网站:http://md.aclickall.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle里的concat,oracle 中的 CONCAT,substring ,MINUS 用法

有的时候,我们有需要将由不同栏位获得的资料串连在一起。每一种资料库都有提供方法来达到这个目的:MySQL: CONCAT()Oracle: CONCAT(), ||SQL Server: CONCAT() 的语法如下:CONCAT(字串1, 字串2, 字串3, ...): 将字串1、字串2、字串3&#xff…

python调用c++_python高性能编程之Cython篇 第一章

第一节 cython的潜能•Cython是一种编程语言,它将Python与C和C 的静态类型系统相结合。•Cython是一个将Cython源代码转换为高效的C或C 源代码的编译器。然后可以将此源代码编译为Python扩展模块或独立可执行文件。Cython的强大功能来自它结合了Python和C的方式&…

oracle获取序列并赋值,Oracle中序列的使用

数据库设计的三大范式第一条就是独立的表结构中必须有唯一主键来标识表中数据.在以往微软的SQL Server(duo版本)平台上.手动编码实现表中主键.并设定为自增列是极其简单.编码如下:typeidintnotnullprimarykeyidentity(1,1),在Oracle 10G中关于序列(Sequence)的使用.(A)Sequence…

中文python笔记_python 中文编码笔记

最近碰了很多钉子。。。不得不说,python2.6相较于之前发布的版本,就编码方面来说,有明显的进步。本机使用的是python2.6,同样的代码根本没有遇到问题。到了服务器上部署时,一台服务器的python2.5和另一台服务器的pytho…

oracle 如何 更改 ref cursor 结果集,oracle – 如何从anther调用一个存储过程并修改返回的refcursor?...

不直接,没有.SYS_REFCURSOR是指向结果的指针 – 您唯一能做的就是获取数据.您无法修改结果集.P_PROC2可以从SYS_REFCURSOR获取数据,发出查询以从其他表中获取其他数据,并将某些内容返回给调用者.那时,我倾向于倾向于将P_PROC2转换为流水线表函数.但是您可以返回包含修改后数据的…

python读取usb扫码枪数据_vue扫码枪input接收数据

1.使用场景vue 项目, 需要用扫码枪完成获取二维码中内容并进行处理的功能, 扫码枪就是普通那种,先找到一个有焦点的input,然后扫码枪工作,将扫描到的信息录入到input中,必须要有焦点。打开modal&#xff0c…

oracle不空顺序输出,Oracle应用笔记

简单整理自己的oracle笔记。1、采用excel表格中的数据直接粘贴数据库记录中,默认会在后面加一个空格“”,操作完成后一定要记得对空格匹配然后修改一下。2、查询数据库里的所有表结构,采用select * from dba_tables(sys登录);查看…

pythonasyncio并发编程实战_python异步编程之asyncio(百万并发)

[python异步编程之asyncio(百万并发)]前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病。然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板…

oracle序时账是什么,序时账和明细账区别是什么

序时账和明细账区别:一、定义不同:1、明细账也称明细分类账,是根据总账科目所属的明细科目设置的,,用于分类登记某一类经济业务事项,提供有关明细核算资料。2、而序时账了,也称日记账,是指按照经济业务发生…

arp攻击 python_python之arp攻击

----------------------------------------看到上面的代码,你笑了吗?--------------------------------------------------------------------------------------------好了,不胡闹了。正点来了:#!/usr/bin/python3# -*- coding: …

php 空格用什么表示方法,php用空格代替标点符号

cf 730i题意:有n个人,每个人有两个能力值,选a个人用它的第一个能力值,b个人用它的第二个能力值,每个人只能选一次,求一个方案使得能力值之和最大,并输出选择方案. 题解:最小费用最大流,原点1向n个人每个人i ...JavaScript事件关于JavaScript事件讲解得很全面的一篇文章:http://…

wxpython wx listctrl_wxPython - ListCtrl列表排序

13.4.2 如何对列表排序?在wxPython中有三个有用的方法可以对列表进行排序,在这一节,我们将按照从易到难的顺序来讨论。在创建的时候告诉列表去排序对一个列表控件排序的最容易的方法,是在构造函数中告诉该列表控件对项目进行排序。…

oracle的知识,oracle的基本知识

OracleSqlServer2000 2005MySqlDB2ORACLE sun SUN数据库 DataBase db存储数据数据 Data数字 符号 字符 信息DBMS 数据库管理系统SQL : 结构化查询语言笔试: scjp sql 20 - 30%Oracle 10g XEOracle 9iSQL:CRUD增删改查DDLDMLDCL: DBA查询数据库中所有的表:select …

linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆

最近,我们想对MongoDB在大量连接中的行为进行基准测试。这使我不得不重新讨论该主题,并刷新关于如何在Linux服务器上创建大量连接和线程的记忆。在此过程中,我发现了一些没有使用过的新可调参数。MongoDB配置甚至MongoDB本身也可以选择限制传…

ui li 菜单 点击添加下级_【Qt开发】实现系统托盘,托盘菜单,托盘消息

概述系统托盘就是在系统桌面底部特定的区域显示运行的程序。windows在任务栏状态区域,linux在布告栏区域。应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能。演示Demo实现功能:1.应用启动后,任…

linux命令date的功能,Linux 命令date

1.命令名称(Command Name):data2.命令作用(Command Function):打印或设置系统日期和时间(print or set the system date and time)3.命令描述(Command Description):显示当前时间在给定的格式,或设置系统日期。( Display the cur…

python组合数据分类_Python解决数据样本类别分布不均衡问题

所谓不平衡指的是:不同类别的样本数量差异非常大。数据规模上可以分为大数据分布不均衡和小数据分布不均衡。大数据分布不均衡:例如拥有1000万条记录的数据集中,其中占比50万条的少数分类样本便于属于这种情况。小数据分布不均衡:…

5g通用模组是什么_中国移动联合芯讯通发布5G终端、芯片及测试产业报告

11月19日,2020中国移动全球合作伙伴大会以“5G融入百业 数智引领未来”为主题在广州召开,从多个维度展现了中国移动运用5G技术驱动各行业转型升级的强大实力。并于21日在展会现场发布了《5G终端、芯片及测试产业报告》。5G终端、芯片及测试产业报告发布现…

dell网卡linux驱动,DELL R710 服务器 Linux 系统网卡驱动安装

DELL R710在装完AS4U7版本的Linux后发现,网卡没有识别出来。怀疑是网卡驱动没有装上,打电话给DELL的工程师,得到的答复是装系统前必须用随机带的引导盘来安装才能将网卡驱动装上。现在系统已经装完了,总不能重装一遍吧&#xff0c…

博客网站源代码_详解SEO布词以及网站排名优化技巧

首先,谈谈新手以及老手在认知上容易出现的SEO误区,我认为有以下几点因素,不容忽视。1、SEO优化就是为了排名、就是发外链不少人认为做SEO就是为了排名,完全不考虑网站文章的质量、可读性以及用户体验,甚至不惜使用一些…