实验名称:

基于urllib库的网页数据爬取

实验目的及要求:

实验目的

通过本实验了解和掌握urllib库。

实验要求

1. 使用urllib库爬取百度搜索页面

2. 使用urllib库获取百度搜索的关键字搜索结果(关键字任选)。

实验原理及内容:填写格式:宋体,五号,行距最小值18

实验原理】(列出相关知识点)

1urllib.request.urlopen 这个函数用于打开一个URL,返回一个文件对象,然后可以通过该文件对象来获取服务器的响应。在这个过程中,urllib会向目标服务器发送HTTP请求,并接收服务器的响应。

2、请求参数和编码:在构建URL时,可以使用urllib.parse.urlencode来将请求参数编码并拼接到URL中。这是为了将查询参数传递给服务器,以便进行搜索或其他操作。

3Headers(请求头): 有些网站对请求头进行检查,以确定请求是否来自合法的浏览器。通过在请求中添加合适的Headers,可以模拟浏览器的请求,降低被识别为爬虫的概率。这可以通过在urllib.request.Request对象中添加Headers来实现。

4URL解析和构建:

解析URL:使用urllib.parse.urlparse函数解析URL,获取其各个部分的信息(协议、主机、路径等)。

构建URL:使用urllib.parse.urljoin函数构建绝对路径的URL

程序思路

程序的思路可以总结为以下几个步骤:

1. 构建URL:根据实验要求,我们首先需要构建URL。如果是爬取百度搜索页面,可以使用百度的首页URL;如果是关键字搜索结果,需要在URL中加入相应的查询参数。

2.发送HTTP请求:使用`urllib.request.urlopen`函数打开URL,获取服务器的响应。

3.读取响应内容:通过响应对象可以获取服务器返回的HTML内容。

4.打印或处理HTML内容:对获取的HTML内容进行处理,可以选择打印出前几个字符,保存到文件中,或者进行进一步的解析。

5.查询参数处理(如果是关键字搜索):如果是关键字搜索,需要构建带有查询参数的URL

6.发送带查询参数的HTTP请求:通过`urllib.request.urlopen`发送带有查询参数的HTTP请求。

7.读取关键字搜索结果的HTML内容:与之前相同,通过响应对象获取服务器返回的HTML内容。

8.打印或处理关键字搜索结果的HTML内容:对获取的HTML内容进行处理,可以选择打印出前几个字符,保存到文件中,或者进行进一步的解析。

实验数据与结果分析:(含运行结果截屏)

【实验结果】

【结果分析】

通过进行这两个实验,在第一个实验中成功将百度搜索页面爬取下来,但在第二个实验中,触发了百度的安全验证,导致搜索关键词停止,无法爬取后面的内容,在尝试添加一些头信息或使用代理等手段后,仍被阻止,故无法读取后续结果。

实验小结:(包括问题和解决方法、心得体会、意见与建议等)

一、问题与解决方法:

安全验证问题:在爬取百度搜索页面时,可能遇到安全验证问题,导致无法直接获取页面内容。解决方法可能包括添加请求头信息,使用代理服务器,或者采用其他绕过安全验证的策略。

异常处理:在实际运行中,可能会遇到各种异常,如网络连接问题、超时等。建议使用适当的异常处理机制来增强代码的稳定性。

二、心得体会:

通过本次实验,我了解了使用`urllib`库进行网页爬取的基本流程,包括构建URL、发送HTTP请求、处理响应等步骤。同时也了解了实验中可能遇到网站的反爬虫机制,需要适应性地调整代码,添加头信息、使用代理等手段来规避这些机制。

三、意见与建议:

我应该去学习更多爬虫技术,可以进一步学习相关的爬虫技术,包括使用更高级的库(如ScrapyBeautifulSoupSelenium)和处理动态网页爬取等。同时在实际应用中,我们也要注意遵循网站的使用规范,不要滥用爬虫,以免造成对方服务器的过大负担,甚至被封禁IP

四、总结:

通过这个实验,初步了解了`urllib`库的使用和基本的网页爬取原理。在实际应用中,需要不断学习、调整和优化代码,以应对各种可能遇到的情况。

实验源代码清单:(带注释)

import urllib.request #导入urllib库response = urllib.request.urlopen('http://www.baidu.com')html=response.read()#读取网页print(html)#输出网页import urllib.requestimport urllib.parsedef baidu_search(keyword): base_url = "https://www.baidu.com/s" params = {"wd": keyword} # 构建查询参数 # 将查询参数编码并拼接到URL中 url = base_url + '" />