Python网络爬虫与信息提取

目标:掌握定向网络数据爬取和网页解析的基本能力。

the website is the API

课程分为以下部分:

1、requsets库(自动爬取HTML页面、自动网络请求提交)

2、robots.txt规则(网络爬虫排除标准)(合理合法的使用爬虫)

3、beautiful soup库(解析HTML页面)(提取相关项目)

4、projects项目(实战项目A/B)

5、re正则表达式库(正则表达式详解、提取页面关键信息)

6、专业网络爬虫框架scrapy*(网络爬虫原理介绍、专业爬虫框架介绍)

IDE:集成开发环境,编写、调试、发布Python程序的工具。

常用的Python IDE工具有2大类:

一、文本工具类IDE

二、集成工具类IDE

IDLE:自带、默认、常用、入门级。包含交互式和文件式两种方式。

使用:Python入门、功能简单直接、300+代码以内

sublime text:专为程序员开发的第三方专用编程工具、专业编程体验(专业程序员都用这个)、多种编程风格、工具非注册免费试用。

Wing:公司维护,工具收费;调试功能丰富;版本控制,版本同步;适合多人共同开发

Visual Studio & PTVS:微软公司维护;win环境为主;调试功能丰富。

PyCharm:社区版免费;简单,集成度高;适合较复杂工程。

专门针对科学计算、数据分析的IDE

Canopy:公司维护,工具收费;支持近500个第三方库;适合科学计算领域应用开发。

Anaconda:开源免费;支持近800个第三方库。

Requests库入门

requests库安装:

1、打开“cmd”;2、输入:pip install requests;3、安装完成

requests库测试:  在IDLE操作

>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.status_code # 查看r的状态码
200 # 状态码为200表示爬取成功,不是200则访问失败
>>> r.encoding = "utf-8"
>>> r.text # 下面内容表示成功爬取百度首页内容
'<!DOCTYPE html>\r\n<!--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>\');\r\n </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>\r\n'

requests库的7个主要方法

方法 说明
requests.request() 构造一个请求,是支撑一下各种方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requsets.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的DELETE

requests.get()方法介绍

r = requests.get(url)   # 获得一个网页

Response对象返回所有网页内容

 requests.get(url, params=None, **kwargs)

 # url: 拟获取页面的url链接
# params:url中的额外参数,字典或字节流格式,可选
# **kwargs:12个控制访问的参数

Response对象的属性

属性 说明
r.status_code HTTP请求的返回状态,200表示链接成功,404表示失败(只要不是200就是失败)
r.text HTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)(更准确)推荐
r.content HTTP响应内容的二进制形式

r.encoding:根据HTTP中header中charset分析编码方式,如果header中不存在charset,则认为编码为ISO-8859-1

r.apparent_encoding:跟准确,根据HTTP内容分析可能的编码方式,

requests.get()方法获取网上资源的流程

1、用r.status_code方法检查返回的Response对象的状态。

爬取网页的通用代码框架

网络爬取有风险,异常处理很重要

理解requests库的异常

异常 说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败、防火墙拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLReuired URL缺失异常
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常(仅指与远程服务器连接过程超时)
requests.Timeout 请求URL超时,产生超时异常(发出URL请求到收到内容整个过程超时)
异常 说明
r.raise_for_status() 如果是200,则表示正确;如果不是200,则产生异常requests.HTTPError

爬取网页的通用代码框架

 import requests

 def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
 if __name__ == "__main__":
url = "http://www.baidu.com"
print(getHTTPText(url))

网络爬虫的盗亦有道--robots协议介绍

HTTP协议

HTTP,hypertext transfer protocol,超文本传输协议。

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议

  • 请求与响应模式:用户发出请求,服务器做出响应。
  • 无状态:第一次请求和第二次请求之间没有相关关联

HTTP协议采用URL作为定位网络资源的标识

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

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

port:端口号,缺省端口为80(默认80)

path:请求资源的路径

  • HTTP URL的理解:URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源

HTTP协议对资源的操作

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

理解PATCH和PUT的区别

假设URL位置有一组数据UserInfo,包括UserID、 UserName等20个字段

需求:用户修改了UserName,其他不变
• 采用PATCH,仅向URL提交UserName的局部更新请求
• 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽

HTTP协议与Requests库

Requests库的head()方法:可以通过很少的流量,获得资源的概要信息

Requests库的post()方法:向服务器提交新增数据

Requests库的post()方法:与post方法类似,只是会将原有的数据覆盖

 Requests库主要方法解析:

Requests库的7个主要方法

 requests.request(method,url,**kwargs)
method: 请求方式,对应get/put/post等7种
url: 拟获取页面的url连接
**kwargs: 控制访问的参数,共13个

method : 请求方式
r = requests.request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPTIONS', url, **kwargs)

requests.request(method, url, **kwargs)   **kwargs参数介绍

---**kwargs:控制访问的参数,均为可选项

1、params:字典或字节序列,作为参数增加到url中

 >>> kv = {'key1':'value1','key2':'value2'}
>>> r = requests.request('GET','http://python123.io/ws',params=kv)
>>> print(r.url)
https://python123.io/ws?key1=value1&key2=value2

2、data:字典、字节序列或文件对象,作为request的内容

 >>> kv = {'key1':'value1','key2':'value2'}
>>> r = requests.request('POST','http://python123.io/ws',data=kv)
>>> body = '主题内容'
>>> r = requests.request('POST','http://pyhton123.io/ws',data=body)

3、json:JSON格式的数据,作为request的内容

 >>> kv ={'key1':'value1'}
>>> r = requests.request('POST','http://python123.io/ws',json=kv)

4、headers:字典,HTTP定制头(模拟任何浏览器,向浏览器发起访问)

>>> hd = {'user-agent':'Chrome/10'}   # Chrome/10  Chrome浏览器第10个版本
>>> r = requests.request('POST','http://python123.io/ws',headers=hd)

Requests库爬取实例

学习资料:中国大学MOOC-Python网络爬虫与信息提取

【Python爬虫】01:网络爬虫--规则的更多相关文章

  1. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  2. Python初学者之网络爬虫(二)

    声明:本文内容和涉及到的代码仅限于个人学习,任何人不得作为商业用途.转载请附上此文章地址 本篇文章Python初学者之网络爬虫的继续,最新代码已提交到https://github.com/octans ...

  3. Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://bbs.51testing. ...

  4. Python 利用Python编写简单网络爬虫实例2

    利用Python编写简单网络爬虫实例2 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站“http://www.51testing. ...

  5. 智普教育Python培训之Python开发视频教程网络爬虫实战项目

    网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 01.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Python视频 02.mp4 网络爬虫项目实训:看我如何下载韩寒博客文章Pytho ...

  6. Python爬虫-01:爬虫的概念及分类

    目录 # 1. 为什么要爬虫? 2. 什么是爬虫? 3. 爬虫如何抓取网页数据? # 4. Python爬虫的优势? 5. 学习路线 6. 爬虫的分类 6.1 通用爬虫: 6.2 聚焦爬虫: # 1. ...

  7. 从零开始学Python 三(网络爬虫)

    本章由网络爬虫的编写来学习python.首先写几行代码抓取百度首页,提提精神,代码如下: import urllib.request file=urllib.request.urlopen(" ...

  8. Python中的网络爬虫怎么用?

    爬虫概述 (约2016年)网络爬虫个人使用和科研范畴基本不存在问题,但商业盈利范畴就要看对方了. 通过网站的Robots协议(爬虫协议)可以知道可以和不可以抓取的内容,其中User-Agent: 为允 ...

  9. Python 基础教程 —— 网络爬虫入门篇

    前言 Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言,它由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年.自面世以后,Pytho ...

  10. 【Python开发】【神经网络与深度学习】如何利用Python写简单网络爬虫

    平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看   先分析网站内容,红色部分即是网站文章内容div,可以看 ...

随机推荐

  1. leftBarButtonItem 的颜色

    修改系统:leftBarButtonItem, rightBarButtonItem 的颜色 在你需要修改的页面,ViewDidload()方法里面贴上下面代码 self.navigationCont ...

  2. DataBase——Mysql的DataHelper

    源帖 https://www.cnblogs.com/youuuu/archive/2011/06/16/2082730.html 保护原帖,尊重技术,致敬工匠! using System; usin ...

  3. CSS-图片占位的技巧

      图片占位技巧,防止动态获取图片 网络慢,页面一跳一跳的情况发生 .food .image-header {                position: relative;  width: 1 ...

  4. cocos creator 刚体卡顿问题(边界会卡住)

    **问题描述:**在项目开发中,使用到了刚体, 在搭建地图过程中,发现两个相邻的砖块,即使贴合的再紧密,但星星人在上面走动的时候还是会有很大概率发生卡顿(被两个刚体的边界处卡住).为了解决这个问题,我 ...

  5. 2019南昌邀请赛 L 计算几何 G(待补)

    #include<bits/stdc++.h> const double PI=acos(-1.0); ; using namespace std; struct Point { doub ...

  6. 私有IP

    私有IP地址段为10.0.0.0-10.255.255.255,172.16.0.0-172.31.255.255,192.168.0.0-192.168.255.255.

  7. robotframework之滚动条

    在测试过程中遇到侧边栏以及下拉框中元素超过div长度时,会自动增加滚动条 网上对于robotframework中的滚动条信息只有: Execute Javascript document.docume ...

  8. 在树莓派上的wireshark报错

    QT: XKEYBOARD extension not present on the X server 我在树莓派2b下的vnc远程连接到kali-all(所谓的kali-all就是在kali官方提供 ...

  9. 芯灵思Sinlinx A64开发板设置qt程序自启动

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 对于开发板开机启动程序的设置可以这样做通过串口连接开发板 v ...

  10. flutter 容器 几种写法

    1.Stack: 取代线性布局 (译者语:和Android中的LinearLayout相似),Stack允许子 widget 堆叠, 你可以使用 Positioned 来定位他们相对于Stack的上下 ...