文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【100天精通python】Day43:python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

2023-08-31 10:38

关注

目录

1 urlib 库

2 Beautiful Soup库

3 使用代理

3.1 代理种类 HTTP、HTTPS 和 SOCKS5

3.2 使用 urllib 和 requests 库使用代理

3.3 案例:自建代理池

4 实战 提取视频信息并进行分析


   urllib 是 Python 内置的标准库,用于处理URL、发送HTTP请求和处理网络数据。它包含多个模块,如 urllib.request 用于发送请求,urllib.parse 用于解析URL,urllib.error 用于处理异常等。

  • urllib.request:用于发送 HTTP 请求和获取响应。
  • urllib.parse:用于解析 URL,拆分和合并 URL 的各个部分。
  • urllib.error:处理异常,如连接错误、HTTP 错误等。

常用语法:

  1. 发送GET请求:
import urllib.requesturl = "https://www.example.com/"response = urllib.request.urlopen(url)content = response.read().decode("utf-8")print(content)

2 发送POST请求:

import urllib.requesturl = "https://www.example.com/"response = urllib.request.urlopen(url)content = response.read().decode("utf-8")print(content)

3 实战示例:

爬取网页内容:

import urllib.requesturl = "https://www.example.com/"response = urllib.request.urlopen(url)content = response.read().decode("utf-8")print(content)

下载文件:

import urllib.requesturl = "https://www.example.com//sample.pdf"urllib.request.urlretrieve(url, "sample.pdf")print("File downloaded.")

处理异常:

import urllib.errortry:    response = urllib.request.urlopen("https://www.nonexistent-website.com")except urllib.error.URLError as e:    print("Error:", e)

解析URL:

import urllib.parseurl = "https://www.example.com//page?param1=value1¶m2=value2"parsed_url = urllib.parse.urlparse(url)print(parsed_url.scheme)  # 输出协议部分print(parsed_url.netloc)  # 输出域名部分print(parsed_url.query)   # 输出查询参数部分

以上示例只是 urllib 库的一些用法。这个库非常强大,你可以在许多网络操作中使用它,包括爬虫、API调用等。在实际项目中,你可能需要处理更多的细节,如设置请求头、处理响应等。查阅官方文档可以帮助你更全面地了解 urllib 库的功能和用法。 

4 Handler 处理器和自定义 Opener:

处理器(Handler)允许你自定义请求的处理方式,以满足特定的需求。urllib.request 模块提供了一些默认的处理器,例如 HTTPHandler 和 HTTPSHandler,用于处理 HTTP 和 HTTPS 请求。你还可以通过创建自定义的 Opener 来组合不同的处理器,实现更灵活的请求配置。

自定义 Opener 示例:

import urllib.request# 创建自定义 Opener,组合不同的处理器opener = urllib.request.build_opener(urllib.request.HTTPSHandler())# 使用自定义 Opener 发送请求response = opener.open("https://www.example.com/")content = response.read().decode("utf-8")print(content)

5 URLError 和 HTTPError

  URLErrorHTTPError 都是 urllib.error 模块中的异常类,用于处理与网络请求相关的错误情况。

  • URLError:用于捕获与URL相关的异常,如无法解析主机名、网络不可达等。
  • HTTPError:用于捕获 HTTP 错误响应,比如请求的网页不存在(404 Not Found)、服务器错误(500 Internal Server Error)等。

URLError 示例:

import urllib.errortry:    response = urllib.request.urlopen("https://www.nonexistent-website.com")except urllib.error.URLError as e:    print("URLError:", e)

HTTPError 示例:

import urllib.errortry:    response = urllib.request.urlopen("https://www.example.com//nonexistent-page")except urllib.error.HTTPError as e:    print("HTTPError:", e.code, e.reason)

 在示例中,e.code 是 HTTP 错误代码,e.reason 是错误原因。

总之,处理器和 Opener 允许你自定义网络请求的行为,URLErrorHTTPError 则帮助你处理请求中可能出现的错误情况。这些功能在实际网络请求和爬虫任务中都非常有用。

        Beautiful Soup 是一个用于解析HTML和XML文档的Python库,它可以从网页中提取数据,操作文档树,并帮助你浏览和搜索文档的不同部分。它能够帮助你处理标签、属性、文本内容等,使得数据提取和处理变得更加方便。

        Beautiful Soup 是一个强大的Python库,用于解析HTML和XML文档,提取其中的数据。以下是一些 Beautiful Soup 常用的语法和方法:

from bs4 import BeautifulSoup# HTML 示例html = """Sample HTML

Hello, Beautiful Soup

Another paragraph

Example"""# 创建 Beautiful Soup 对象soup = BeautifulSoup(html, "html.parser")# 节点选择器intro_paragraph = soup.pprint("Intro Paragraph:", intro_paragraph)# 方法选择器another_paragraph = soup.find("p")print("Another Paragraph:", another_paragraph)# CSS 选择器link = soup.select_one("a")print("Link:", link)# 获取节点信息text = intro_paragraph.get_text()print("Text:", text)# 获取节点的属性值link_href = link["href"]print("Link Href:", link_href)# 遍历文档树for paragraph in soup.find_all("p"): print(paragraph.get_text())# 获取父节点parent = intro_paragraph.parentprint("Parent:", parent)# 获取兄弟节点sibling = intro_paragraph.find_next_sibling()print("Next Sibling:", sibling)# 使用 CSS 选择器选择多个节点selected_tags = soup.select("p.intro, a")for tag in selected_tags: print("Selected Tag:", tag)# 修改节点文本内容intro_paragraph.string = "Modified Text"print("Modified Paragraph:", intro_paragraph)# 添加新节点new_paragraph = soup.new_tag("p")new_paragraph.string = "New Paragraph"soup.body.append(new_paragraph)# 移除节点link.extract()print("Link Extracted:", link)

3.1 代理种类 HTTP、HTTPS 和 SOCKS5

  • HTTP代理: 用于HTTP协议的代理,适用于浏览网页等HTTP请求。
  • HTTPS代理: 用于HTTPS协议的代理,能够处理加密的HTTPS请求。
  • SOCKS5代理: 更通用的代理协议,支持TCP和UDP流量,适用于各种网络请求。
  • 抓取免费代理:

    可以使用爬虫技术从免费代理网站获取代理IP和端口。

    使用付费代理:

    付费代理通常提供更稳定和更快速的连接,适用于需要高质量代理的情况。

3.2 使用 urllibrequests 库使用代理

urllib:

import urllib.requestproxy_handler = urllib.request.ProxyHandler({'http': 'http://proxy.example.com:8080'})opener = urllib.request.build_opener(proxy_handler)response = opener.open('https://www.example.com/')

requests:

import requestsproxies = {'http': 'http://proxy.example.com:8080'}response = requests.get('https://www.example.com/', proxies=proxies)

3.3 案例:自建代理池

import requestsfrom bs4 import BeautifulSoupimport random# 获取代理IP列表def get_proxies():    proxy_url = "https://www.example.com//proxy-list"    response = requests.get(proxy_url)    soup = BeautifulSoup(response.text, "html.parser")    proxies = [proxy.text for proxy in soup.select(".proxy")]    return proxies# 从代理池中随机选择一个代理def get_random_proxy(proxies):    return random.choice(proxies)# 使用代理发送请求def send_request_with_proxy(url, proxy):    proxies = {'http': proxy, 'https': proxy}    response = requests.get(url, proxies=proxies)    return response.textif __name__ == "__main__":    proxy_list = get_proxies()    random_proxy = get_random_proxy(proxy_list)        target_url = "https://www.example.com/"    response_content = send_request_with_proxy(target_url, random_proxy)    print(response_content)

这个案例演示了如何从代理池中随机选择一个代理,并使用选定的代理发送请求。请注意,示例中的URL和方法可能需要根据实际情况进行修改。

这些概念和示例可以帮助你了解如何使用代理,从而在网络爬虫或请求中保护你的身份和数据。

import urllib.requestfrom bs4 import BeautifulSoup# 定义目标网页的 URLurl = 'https://www.example.com//videos'# 定义代理(如果需要使用代理)proxies = {'http': 'http://proxy.example.com:8080'}# 发起请求,使用代理req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})response = urllib.request.urlopen(req, proxies=proxies)# 解析网页内容soup = BeautifulSoup(response, 'html.parser')# 创建一个空的视频列表videos = []# 获取视频信息video_elements = soup.find_all('div', class_='video')for video_element in video_elements:    title = video_element.find('h2').text    video_link = video_element.find('a', class_='video-link')['href']    videos.append({'title': title, 'video_link': video_link})# 输出提取到的视频信息for video in videos:    print(f"Title: {video['title']}")    print(f"Video Link: {video['video_link']}")    print()# 对视频信息进行分析num_videos = len(videos)print(f"Total Videos: {num_videos}")

        在这个实例中,我们假设目标网页包含多个视频的信息,每个视频都有和视频链接。我们使用 urllib 库获取网页内容,然后使用 Beautiful Soup 解析页面,从中提取视频的和链接。最后,我们输出提取到的视频信息并对其进行简单的分析,计算视频的数量。

        请注意,这个实例仅用于演示基本的数据提取和分析概念。在实际应用中,你可能需要根据目标网页的结构和内容,调整代码以适应实际情况。

来源地址:https://blog.csdn.net/qq_35831906/article/details/132382676

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯