网络爬虫--抓取网页数据知识点

一、概念

网络爬虫(Web Crawler)是一种自动化程序,它通过模拟人的操作访问网站,给网站发送请求,然后解析返回的数据,提取需要的信息。网络爬虫可以用于数据采集、搜索引擎、竞争情报等领域。从网站自动提取结构化信息的技术,这一技术在多个领域都有广泛的应用,如数据分析、市场研究、价格监控等。

爬虫软件:

Python官网下载并安装最新版本的Python。

Python官网链接:https://www.python.org/

PyCharm官方网址:PyCharm: the Python IDE for Professional Developers by JetBrains

 相关安装教程可在网站自我查找

网络爬虫和浏览器的区别

浏览器和爬虫都是在访问网站的服务器,然后返回对应的数据。不同的是,浏览器返回的数据还会经过渲染,变成十分美观的界面。而对于爬虫来说,返回的一般是原生的HTML代码。

什么是urllib库:

urllib库是Python中的一个用于处理网络请求的标准库。这个库提供了以下功能:

  1. 模拟浏览器的行为,向指定的服务器发送一个请求。
  2. 保存服务器返回的数据。
  3. 方便地将网页上的一个文件保存到本地。

urllib库包含四个模块:

  • urllib.request:用于模拟浏览器发起网络请求。

简单的示例:

import urllib.request  
  
url = "  "  
response = urllib.request.urlopen(url)  
data = response.read()  
print(data)
  • urllib.parse:用于解析URL。(提供了一组函数来拆分、组合和引用 URL。)
  • from urllib.parse import urlparse  
      
    url = "  "  
    parsed_url = urlparse(url)  
    print(parsed_url)  # 输出 ParseResult 对象

 一、urlunparse():此函数与 urlparse() 相反,它接受一个包含 URL 各部分的元组,并将其组合成一个完整的 URL 字符串。

二、quote() 和 unquote():这些函数用于对 URL 中的特殊字符进行编码和解码。这对于在 URL 中安全地传输参数很有用。

三、urlencode():此函数用于将字典或包含两元组的列表转换为 URL 编码的查询字符串。这对于构建 GET 请求的查询参数非常有用。

这些是 urllib.parse 库中一些常用的函数和方法。它们使处理 URL 变得简单而方便

  • urllib.error:用于处理request引起的异常。

两个异常类:URLError  HTTPError

演示如何使用 urllib.error 来捕获和处理异常:

import urllib.request  
from urllib.error import URLError, HTTPError  
  
url = "https://example.com"  
  
try:  
    response = urllib.request.urlopen(url)  
except URLError as e:  
    print("URL Error:", e.reason)  
except HTTPError as e:  
    print("HTTP Error:", e.code, e.reason)  
else:  
    data = response.read()  
    print("Data:", data)

上面的示例中,我们尝试打开指定的 URL。如果发生 URLError 或 HTTPError 异常,我们会捕获它们并打印相应的错误消息。否则,我们会读取响应数据并打印出来。 

此代码仅供参考,内容需要自己捕捉。 

  • urllib.robotparser:用于解析robots.txt文件,应用较少。

两个类:RobotFileParser 和 HTTPGetRobotsParser

简单的示例,演示如何使用 urllib.robotparser 模块:

import urllib.robotparser  
import urllib.request  
  
# 设置要解析的 robots.txt 文件的 URL  
url = "http://www.example.com/robots.txt"  
  
# 创建一个 RobotFileParser 对象  
rp = urllib.robotparser.RobotFileParser()  
  
# 读取 robots.txt 文件的内容  
response = urllib.request.urlopen(url)  
content = response.read().decode("utf-8")  
  
# 解析 robots.txt 文件内容  
rp.parse(content.split("\n"))  
  
# 检查特定爬虫是否有权抓取特定 URL 的内容  
user_agent = "my_crawler"  
url_to_check = "http://www.example.com/somepage"  
can_fetch = rp.can_fetch(user_agent, url_to_check)  
print(can_fetch)  # 输出 True 或 False,表示是否允许抓取该 URL 的内容

我们首先设置要解析的 robots.txt 文件的 URL。然后,我们创建一个 RobotFileParser 对象,并使用 urlopen 方法读取文件内容。接下来,使用 parse() 方法解析文件内容,用 can_fetch() 方法检查特定爬虫是否有权抓取特定 URL 的内容。最后,打印出结果。

转换URL编码:

只需要对URL参数进行编码

import urllib.parse  
  
params = {  
    "param1": "value1",  
    "param2": "value2"  
}  
  
# 对URL参数进行编码  
params_encoded = urllib.parse.urlencode(params)  
  
print(params_encoded)

1.运行上述代码将输出类似以下的URL字符串:

http://example.com/api?param1=value1&param2=value2

使用HTTPResponse对象:

在Python中,使用HTTPResponse对象通常涉及到使用像requests这样的库来发送HTTP请求。requests库返回一个Response对象,它实际上是HTTPResponse的一个子类。以下是如何使用HTTPResponse对象的基本示例:

 1.首先,确保已经安装了requests库。如果没有,可以在cmd使用以下命令安装:

pip install requests

  2.导入必要的模块:

import requests

3. 发送一个HTTP请求并获取响应:

response = requests.get('https://www.example.com')

4.response是一个Response对象,它包含了HTTP响应的各种信息。你可以通过访问其属性来获取这些信息。例如,要获取响应状态码,可以使用:

status_code = response.status_code

print(f"Status Code: {status_code}")

5.要获取响应内容(通常是HTML、JSON或其他数据),可以使用:

content = response.content print(content)

 6.如果你知道响应内容是JSON格式的,可以使用json()方法将其解析为Python对象:

json_content = response.json()

print(json_content)

 7.要获取响应头,可以使用:

headers = response.headers

print(headers)

8. 当处理完响应后,确保关闭它以释放资源

response.close()

这就是使用HTTPResponse对象(具体来说,通过requests库得到的Response对象)进行基本的HTTP请求和响应处理的基本步骤。

使用urllib实现数据传输:

urllib 是 Python 中一个强大的库,用于处理 URL,包括读取和打开 URL(主要是 HTTP),以及构建 URL。urllib 可以非常方便地发送 HTTP 请求,实现数据的传输。

下面是一个简单的示例,展示了如何使用 urllib 的 urlopen 函数发送 GET 请求:

import urllib.request  
  
url = 'http://www.example.com'  
  
response = urllib.request.urlopen(url)  
print(response.read())

如果你想发送 POST 请求并传输一些数据,可以使用 urlopen 函数的 data 参数。数据需要是字节流的形式,可以使用 urllib.parse.urlencode 函数将字典转换为字节流。这是一个示例:

import urllib.request  
import urllib.parse  
  
url = 'http://www.example.com/post'  
data = {'key1': 'value1', 'key2': 'value2'}  
data = urllib.parse.urlencode(data).encode('utf-8')  # 编码为字节流  
  
response = urllib.request.urlopen(url, data)  
print(response.read())

注意,以上代码没有处理 HTTP 错误和异常。在实际使用中,你可能需要添加错误处理代码,例如使用 try/except 块来捕获 HTTPError 和 URLError 异常。同时,你可能需要添加请求头(例如 User-Agent)以避免被某些网站拒绝。例如:

import urllib.request  
import urllib.parse  
from urllib.error import HTTPError, URLError  
  
url = 'http://www.example.com/post'  
data = {'key1': 'value1', 'key2': 'value2'}  
data = urllib.parse.urlencode(data).encode('utf-8')  # 编码为字节流  
  
req = urllib.request.Request(url, data)  
req.add_header('User-Agent', 'Mozilla/5.0')  # 添加请求头  
  
try:  
    response = urllib.request.urlopen(req)  
except HTTPError as e:  
    print('The server couldn\'t fulfill the request.')  
    print('Error code: ', e.code)  
except URLError as e:  
    print('We failed to reach a server.')  
    print('Reason: ', e.reason)  
else:  
    print(response.read())

怎么设置超时:

对于设置超时,可以根据具体的场景选择不同的方式。

如果是在Java中进行网络通讯的超时设置,可以通过System.setProperty()方法来设置。具体来说,可以设置两个参数:“sun.net.client.defaultConnectTimeout”和“sun.net.client.defaultReadTimeout”,分别表示连接主机的超时时间和从主机读取数据的超时时间,单位是毫秒。

在Spring框架中,事务超时的设置可以在@Transactional注解上完成,例如@Transactional(timeout = 3)。如果在@Transactional注解上设置了超时,那么它会覆盖默认的配置。事务超时的实现原理可以用以下流程进行描述:假设事务超时为5秒,需要执行3个sql,那么每个sql的statement timeout会设置为5秒,执行耗时1s,那么整个事务超时还剩4秒;执行耗时2秒,整个事务超时还是2秒;执行耗时超过2s,那么整个事务超时,抛出异常。

总结:

以上就是我所讲述的关于抓取网页数据的一些知识点,它拥有强大的数据获取能力,提高效率,也要注意反爬机制,虽然有很多现成的库和工具可以帮助实现网页抓取,但要真正掌握并灵活运用这一技术,还需要深入学习和实践。总的来说,抓取网页数据是一项强大而复杂的技术。在享受其带来的便利的同时,也要时刻注意合法性和道德性,不要超出道德的底线,确保数据的合规使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值