第三章 使用urlib爬取北京公交线路

名词解释: 

1.1网络爬虫概述

网络爬虫,即web spider。网络蜘蛛是通过网页链接的地址来寻找网页。

 1.2 超文本和html

一个典型的HTTP请求过程如下:    

(1)用户在浏览器中输入网址,比如http://dblab.xmu.edu.cn,浏览器向网页服务器发起请求;     (2)网页服务器接收用户访问请求,处理请求,产生响应(即把处理结果以HTML形式返回给浏览器)     

(3)浏览器接收来自网页服务器的HTML内容,进行渲染以后展示给用户。

 1.3 网络爬虫的原理

爬虫就是发送请求获取网站内容并从中提取数据的自动化程序。其中请求,提取,自动化是爬虫的关键,网络爬虫的基本流程如图:

 程序填空题

2.1 PYTHON实现HTTP网络请求

python实现http网络请求的常见三种三种方式:urllib,urllib3和requests库

1.urllib是python中一个最基本的网络请求库,可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

在Python3的urllib库中,所有和网络请求相关的方法,都被集中到urllib.request模块下

(1)urlopen函数(程序填空题)

urllib.request.urlopen()函数用于实现对目标url的访问。

urllib.request.urlopen(url,data=None,[timeout,]*,

cafile=None, capath=None, cadefault=False,context=None)

url 参数:目标资源在网路中的位置。可以是一个表示URL的字符串(如:http://www.pythontab.com/)。

data参数:data用来指明发往服务器请求中的额外的参数信息(如:在线翻译,在线答题等提交的内容),data默认是None,此时以GET方式发送请求;当用户给出data参数的时候,改为POST方式发送请求。

timeout:设置网站的访问超时时间

cafile、capath、cadefault 参数:用于实现可信任的CA证书的HTTP请求。(基本上很少用)

context参数:实现SSL加密传输。(基本上很少用)
 

(2)返回处理方法详解

urlopen返回对象提供方法:

1)read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作

2)info():返回HTTPMessage对象,表示远程服务器返回的头信息

3)getcode():返回Http状态码。如果是http请求,200代码表示请求成功完成;404代码表示网址未找到。

4)geturl():返回请求的url

【例】利用urllib通过urlopen方式读取百度首页。

#导入模块

from urllib import (request)

#打开指定需要爬取的网页 

resp = request.(urlopen)('http://www.baidu.com')

#读取网页代码,并输出

print(resp.read())

有些网络爬虫的请求可能因为网络原因无法得到响应。因此,我们可以手动设置超时时间。当请求超时后,可以采取进一步措施,例如选择直接丢弃该请求或者再重新请求一次。

2.2传递参数

(1)传递URL参数

import urllib.request

import urllib.pa

params = urllib.parse.urlencode({'q': 'urllib', 'check_keywords': 'yes', 'area': 'default'})

url = "HTTP://docs.python.org/3/search.html?{}".format(params)

r = urllib.request.urlopen(url)

print(r.read()) 

(2)传递中文参数

 

2.3  请求headers处理

出现403错误,是因为部分网站设置了反爬虫设置,可以通过模拟浏览器的头部信息来进行访问。

  2.4 传递POST请求

 3.1 HTML解析之Beautifulsoup

BeautifulSoup是—个用于从HTML和XML文件中提取数据的Python库。BeautifulSoup提供一些简单的、函数用来处理导航、搜索、修改分析树等功能。

1.Beautifulsoup的使用

(1)导入bs4库,然后创建一个模拟html代码的字符串

 重点记忆:根据要求的解析器,使用方法。

Python默认的HTML解析器:BeautifulSoup(markup,'html.parser')

lxml的HTML解析器:BeautifulSoup(markup,'lxml')

lxml的XML解析器:Beautifulsoup(markup,['lxml','xml'])

                                 Beautifulsoup(markup,'xml')

3.2 四大对象种类

Beautifulsoup将复杂的HTML文档转换成了一个复杂的树形结构,每个节点都是一个python对象,,所有对象可以归纳为四种:Tag,NavigableString,BeautifulSoup,Comment。Tag就是html的一个个标签。

3.2.1 Tag对象

<title>hello hadoop</title>

<a class="elephant", href="HTTP://example.com/text1" id="elephant1">test1</a>

代码的注释部分即为运行成果:

soup.a       soup,p重点理解记忆

可以利用soup加标签名轻松获取这些标签的内容

下面哪里验证一下这些标签的内容

print type(soup.a)

#<calss 'bs4.element.Tag'>

对于Tag,他有两个重要的属性attrs和name

print soup.nameprint soup.head.name

#[document]#head

在这里,把p标签的所有属性打印输出了出来,得到的类型是一个字典。

 如果想要单独获取某个属性,可以这样来做,例如获取它的 class。

还可以使用get方法传入属性的名称来获取

 还可以对属性内容进行修改

3.2.2  NavigableString对象

 不仅可以得到标签的内容,而且还可以通过“.string”获取标签内部的文字。

 这样就轻松获取到了标签里面的内容,下面来检查一下它的类型。

 3.2.3 Beautifulsoup对象

BeautifulSoup对象表示的是一个文档的全部内容,大部分时候,可以把它当作一个特殊的Tag对象,可以分别获取它的类型,名称和属性。

 3.2.4 comment 对象

Comment对象是一个特殊类型的NavigableString对象,其实输出的内容仍然不包括注释符号,但是如果不好好处理它,可能会对文本处理造成意想不到的麻烦。下面来查找一个带注释的标签。

node:

print soup.a

print soup.a.string

print type(soup.a.string)

running result:

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值