一、概念
网络爬虫(Web Crawler)是一种自动化程序,它通过模拟人的操作访问网站,给网站发送请求,然后解析返回的数据,提取需要的信息。网络爬虫可以用于数据采集、搜索引擎、竞争情报等领域。从网站自动提取结构化信息的技术,这一技术在多个领域都有广泛的应用,如数据分析、市场研究、价格监控等。
爬虫软件:
Python官网下载并安装最新版本的Python。
Python官网链接:https://www.python.org/。
PyCharm官方网址:PyCharm: the Python IDE for Professional Developers by JetBrains
相关安装教程可在网站自我查找
网络爬虫和浏览器的区别
浏览器和爬虫都是在访问网站的服务器,然后返回对应的数据。不同的是,浏览器返回的数据还会经过渲染,变成十分美观的界面。而对于爬虫来说,返回的一般是原生的HTML代码。
什么是urllib库:
urllib库是Python中的一个用于处理网络请求的标准库。这个库提供了以下功能:
- 模拟浏览器的行为,向指定的服务器发送一个请求。
- 保存服务器返回的数据。
- 方便地将网页上的一个文件保存到本地。
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字符串:
使用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,那么整个事务超时,抛出异常。
总结:
以上就是我所讲述的关于抓取网页数据的一些知识点,它拥有强大的数据获取能力,提高效率,也要注意反爬机制,虽然有很多现成的库和工具可以帮助实现网页抓取,但要真正掌握并灵活运用这一技术,还需要深入学习和实践。总的来说,抓取网页数据是一项强大而复杂的技术。在享受其带来的便利的同时,也要时刻注意合法性和道德性,不要超出道德的底线,确保数据的合规使用。