3.1.爬虫

3.1.1.什么是网络爬虫        

        网络爬虫(Web Crawler)是一种自动化程序,可以自动地在互联网上浏览和获取信息。它通常会从指定的起始点开始,按照一定规则遍历网页,获取所需数据并进行抓取、解析、存储等操作。

3.1.1.1.网络爬虫大体组成

网络爬虫的结构可以根据具体需求和实现方式有所不同,但通常包括以下几个核心组件:

  1. 调度器(Scheduler): 调度器负责管理爬取任务的调度和控制流程。它维护一个待爬取的URL队列,并根据一定的策略选择下一个要爬取的URL。调度器还可以处理并发请求、监控任务状态,以及设置任务优先级等功能。

  2. 下载器(Downloader): 下载器负责从网络上获取网页内容。它接收调度器传递的URL请求,并发送HTTP请求到目标网站,获取网页的HTML或其他类型的数据。下载器还要处理异常情况、重试机制、代理设置等,确保成功地获取网页内容。

  3. 解析器(Parser): 解析器负责对下载器获取的网页内容进行解析和提取有用信息。它可以使用各种技术,如正则表达式、XPath、CSS选择器等,来定位和提取所需的数据,然后将这些数据结构化并传递给存储器或其他组件进行处理。

  4. 存储器(Storage): 存储器用于将解析器提取出来的数据保存到本地文件系统、数据库或其他持久化存储介质中。这样可以确保爬取的数据被有效地保存和管理,以备后续分析和应用。

  5. 去重器(Deduplicator): 去重器负责检测和过滤重复的网页内容,以减少无效爬取和存储。它可以使用哈希算法、URL签名等技术来判断两个网页是否相同,避免重复处理相同的内容。

  6. 用户代理池(User-Agent Pool): 用户代理池用于模拟不同浏览器行为,防止爬虫被目标网站识别和封禁。它可以随机选择或轮换使用不同的用户代理(User-Agent)头部信息,使爬虫看起来像是由多个真实用户在访问网页。

这些组件之间通过适当的接口和数据传递方式进行协作,构成了一个完整的网络爬虫系统。不同的爬虫系统可能会根据需求和技术选择适合的组件和实现方式,以达到高效、稳定地抓取和处理目标网页数据的目的。

3.1.1.2.爬虫类型

 网络爬虫可以根据其设计和功能特点分为多种类型,常见的网络爬虫类型包括:

  1. 通用网络爬虫(General Purpose Crawler): 通用网络爬虫旨在广泛地抓取互联网上的各种网页内容,并建立一个全面的网页索引。这类爬虫通常由搜索引擎使用,如谷歌、百度等,用于构建搜索引擎的网页数据库。

  2. 聚焦网络爬虫(Focused Crawler): 聚焦网络爬虫针对特定领域或主题进行抓取,只爬取与指定主题相关的网页内容。这种爬虫通常用于构建专题搜索引擎或聚合特定领域的信息。

  3. 增量式网络爬虫(Incremental Crawler): 增量式网络爬虫主要用于更新已有数据集,只爬取新增或更新的网页内容,以保持数据集的实时性和完整性。

  4. 深层网络爬虫(Deep Web Crawler): 深层网络爬虫用于抓取深层网页或动态生成的网页内容,通常需要处理表单提交、AJAX请求等技术,以获取隐藏在深层网页中的信息。

  5. 垂直搜索爬虫(Vertical Search Crawler): 垂直搜索爬虫专注于特定行业或领域的信息抓取,例如医疗、金融、旅游等,通过深入研究和定制化算法提供更精准的搜索结果。

  6. 社交网络爬虫(Social Media Crawler): 社交网络爬虫专门用于抓取社交媒体平台上的内容,如Twitter、Facebook等,用于分析用户行为、舆情监测等应用。

  7. 媒体爬虫(Media Crawler): 媒体爬虫主要用于抓取图片、视频、音频等多媒体内容,以建立多媒体数据库或提供多媒体搜索功能。

以上是常见的网络爬虫类型,不同类型的网络爬虫在设计和实现上会有所不同,具有不同的适用场景和特点。根据具体需求和目标,选择合适类型的网络爬虫可以提高数据获取的效率和质量。

3.1.1.3.实施爬虫需要注意的事

在使用网络爬虫时,需要注意以下几个方面:

  1. 合法性和道德性: 网络爬虫应该遵守相关法律法规,并且尊重网站的服务条款和隐私政策。不得非法获取、使用或传播他人的个人信息,商业机密或受版权保护的内容。

  2. 尊重网站规则: 爬虫开发者应该遵守网站的robots.txt文件或其他协议规定,不得抓取禁止访问的页面或频繁访问同一页面。同时,应该设置合理的抓取频率和请求间隔,以避免对服务器造成过大负荷。

  3. 数据的合法性和准确性: 爬虫获取的数据可能存在误差或不准确的情况,开发者应该进行数据清洗和验证,确保获取的数据符合预期并具备可用性。

  4. 防范反爬措施: 许多网站会采取反爬虫措施,如验证码、IP封锁、动态网页等技术,开发者需要了解这些措施并采取相应策略,以避免被检测和封禁。

  5. 保护用户隐私和数据安全: 在处理用户数据时,爬虫开发者应该采取必要的安全措施,确保用户隐私不被泄露或滥用。敏感信息如密码、支付信息等应进行加密和安全存储。

  6. 合理使用资源: 爬虫应该合理利用网络带宽和计算资源,避免对服务器和网络造成过度负载,并尽量减少浪费和冗余的抓取操作。

总之,使用网络爬虫需要遵循法律和道德规范,尊重网站规则,并保护用户隐私和数据安全。同时,还应该关注数据的准确性和可用性,以提高爬虫的效率和价值。

3.1.1.4.爬虫的基本工作流程

网络爬虫的基本工作流程通常包括以下几个步骤:

  1. 确定抓取目标: 网络爬虫首先需要确定要抓取的目标网站或页面,可以是整个网站、特定页面或特定类型的内容。

  2. 发送HTTP请求: 爬虫会向目标网站发送HTTP请求,请求特定的页面或资源。这些请求可以是GET请求用于获取页面内容,也可以是POST请求用于提交表单等操作。

  3. 下载页面内容: 爬虫接收到服务器返回的响应后,会下载页面内容,包括HTML、CSS、JavaScript等文件。有些网站可能会返回动态生成的内容,爬虫需要解析JavaScript或模拟浏览器行为来获取完整内容

  4. 解析页面内容: 爬虫会解析下载的页面内容,提取出需要的信息,如链接、文本、图片等。常用的解析方式包括正则表达式、XPath、CSS选择器和HTML解析器等。

  5. 处理提取的信息: 爬虫会对提取的信息进行处理和存储,可以进行数据清洗、去重、格式化等操作,然后保存到数据库或文件中供后续处理和分析。

  6. 跟踪链接: 爬虫会从当前页面中提取链接,并递归地访问这些链接,继续抓取新的页面内容。这样可以实现对整个网站的深度或广度遍历。

  7. 处理异常情况: 在抓取过程中,爬虫可能遇到各种异常情况,如网络超时、页面不存在、反爬虫机制等,需要进行异常处理并采取相应的策略,如重试、切换IP等。

  8. 设定停止条件: 爬虫可以设定停止条件,如抓取的页面数量、深度或时间限制,当满足条件时停止抓取,避免无限循环或过度消耗资源。

总之,网络爬虫通过发送HTTP请求、下载页面内容、解析提取信息等步骤来实现对网站数据的抓取和分析,从而实现自动化的信息获取和处理功能。

3.1.2.处理URL和HTTP请求的库

        3.1.2.1.urllib、urllib2、urllib3
                3.1.2.1.1.urllib、urllib2、urllib3的作用
urllib

・urllib库提供了基本的URL操作功能,包括打开URL、读取数据、编码解码等。

・它包含一些子模块,例如urllib.request用于发送HTTP请求,urllib.parse用于URL解析和参数处理,urllib.error用于处理URL打开时的异常错误等。

・urllib适用于简单的URL操作和数据获取场景。

urllib2

・urllib2库是Python 2.x版本中的一个独立模块,在Python 3.x版本中被合并到了urllib.request中。

・它提供了更多高级的HTTP请求功能,如发送GET、POST、PUT等请求,添加header信息,处理HTTP认证、cookie等。

・urllib2可以用于创建更复杂的HTTP客户端程序。

urllib3

・urllib3是一个第三方库,提供了更高级和功能丰富的HTTP客户端功能。

・它比标准库的urlliburllib2更强大,支持连接池管理、SSL/TLS验证、代理支持、重试机制等。

・urllib3易于使用,并具有良好的性能和可定制性,适用于复杂的HTTP请求场景。

                3.1.2.1.2.urllib、urllib2、urllib3的区别
urllib

・urllib是Python 2.x版本中的一个模块,而在Python 3.x版本中被拆分成了urllib.requesturllib.parse等子模块。

・urllib提供了一些基本的URL操作功能,如打开URL、读取数据、编码解码等。但是它的功能相对较为简单,没有提供高级的HTTP请求功能。

urllib2

・urllib2是Python 2.x版本中的一个独立模块,用于发送和处理HTTP请求。

它是对urllib模块的扩展,提供了更多的HTTP请求方法,如POST、PUT等。

・urllib2还支持处理HTTP的认证、cookie等功能。

但是在Python 3.x版本中,urllib2已被合并到了urllib.request中,所以在Python 3.x中可以直接使用urllib.request来进行HTTP请求。

urllib3

・urllib3是一个第三方库,提供了更高级和功能丰富的HTTP客户端功能。

urlliburllib2相比,urllib3提供了更好的性能、更多的配置选项和更全面的HTTP协议支持。

它支持连接池管理、SSL/TLS验证、代理支持、重试机制等功能,并且易于使用。

        urllib是Python 3.x版本中的标准库模块,提供了基本的URL操作功能;urllib2是Python 2.x版本中的标准库模块,在Python 3.x中被合并到了urllib.request中;而urllib3是第三方库,提供了更高级和功能丰富的HTTP客户端功能。根据你的需求,选择适合的模块来处理URL和HTTP请求。

3.1.2.2.request库

相比于urllib库:

(1)urllib 是 Python 内置的标准库,提供了一系列模块来处理 URL。它包含了多个子模块,如 urllib.requesturllib.parseurllib.error 等,用于发送请求、解析 URL、处理异常等。使用 urllib 可以完成基本的 HTTP 请求和处理响应,但相对来说使用起来比较繁琐,需要编写更多的代码来处理各种细节。

(2)requests 是一个第三方库,提供了简洁而强大的 API,用于发送 HTTP 请求和处理响应。相比于 urllibrequests 更加易用,并且提供了丰富的功能和选项,例如自动处理重定向、会话维护、证书验证等。因此,许多开发者更喜欢使用 requests 来进行 HTTP 请求,因为它能够简化代码并提高开发效率。

request是在urlib的基础上进行封装的,request更加便捷。

例:使用 urllib 发送 GET 请求的示例:

import urllib.request

url = 'http://example.com/api'
response = urllib.request.urlopen(url)
data = response.read().decode('utf-8')
print(data)

例:使用 requests 发送 GET 请求的示例:

import requests

url = 'http://example.com/api'
response = requests.get(url)
print(response.text)

从上面的示例可以看出,使用 requests 相对来说更加简洁和直观。因此,一般情况下推荐使用 requests 库来处理 HTTP 请求,除非有特殊需求需要使用 urllib

总结起来,urllib 是 Python 内置的标准库,提供了处理 URL 和发送 HTTP 请求的基本功能,而 requests 是一个第三方库,提供了更加强大和便捷的 API,用于发送 HTTP 请求和处理响应。

因为request更方便使用,并且建议使用request,所以我们来多说说request。

3.1.2.2.1.发送 GET 请求

例:使用 requests.get() 方法可以发送 GET 请求,并获取服务器响应。

import requests

response = requests.get('http://example.com/api')
print(response.text)
3.1.2.2.2.发送 POST 请求

例:使用 requests.post() 方法可以发送 POST 请求,并传递数据给服务器。

import requests

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://example.com/post', data=payload)
print(response.text)
3.1.2.2.3.设置请求头

例:可以通过 headers 参数设置请求头信息。

import requests

headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('http://example.com', headers=headers)
3.1.2.2.4.处理响应

response 对象包含了服务器响应的各种信息,如状态码、响应头、响应内容等。

可以通过

response.status_code 获取状态码,

response.headers 获取响应头,

response.text 获取响应内容(文本格式),

response.json() 获取 JSON 格式的响应内容等。

3.1.2.2.5.处理异常

例:requests 库会在发生错误时抛出异常,可以使用 try-except 块来处理异常。

import requests

try:
    response = requests.get('http://invalid-url')
    response.raise_for_status()  # 如果请求不成功,抛出异常
except requests.exceptions.RequestException as e:
    print('Error: ', e)
3.1.2.2.6.Session 对象

例:requests 支持创建 Session 对象,用于保持会话状态、跨请求保持参数等。这在需要进行多次相关请求的情况下很有用。

import requests

session = requests.Session()
response1 = session.get('http://example.com/login')
response2 = session.post('http://example.com/dashboard', data={'username': 'user', 'password': 'pass'})

3.1.2.2.7.request的大体参数介绍

    requests.get是Python中requests库提供的HTTP请求方法之一,用于发送HTTP GET请求并返回响应。下面介绍一下requests.get函数的参数:

requests.get(url, params=None, **kwargs)

        其中,url是必选参数,表示请求的URL地址;params是可选参数,表示请求的URL参数,可以是字典、元组列表或字符串;**kwargs是可选参数,表示其他的各种控制HTTP请求的参数,如headers、timeout、auth、proxies等。

具体来说,常见的参数如下:

  1. url: 必须提供的参数,表示请求的URL地址。

  2. params: 可选参数,表示请求的URL参数,可以是以下类型之一:

    • 字典:将作为参数添加到URL后面,例如{'key1': 'value1', 'key2': 'value2'}会编码为key1=value1&key2=value2附加到URL上。

    • 元组列表:类似于字典,但可以包含多个值。例如[('key1', 'value1'), ('key1', 'value2')]会编码为key1=value1&key1=value2附加到URL上。

    • 字符串:将被追加到URL后面,例如'page=2'会附加到URL上。

  3. headers: 可选参数,表示HTTP请求头部信息,通常包含User-Agent、Accept等信息,默认为None

  4. timeout: 可选参数,表示请求超时时间,单位为秒,默认为None,即等待服务器响应的时间不限制。

  5. auth: 可选参数,表示HTTP认证信息,如HTTPBasicAuth对象,默认为None

  6. proxies: 可选参数,表示代理配置信息,如{'http': 'http://xxx.xxx.xxx.xxx:port', 'https': 'https://xxx.xxx.xxx.xxx:port'},默认为None

  7. verify: 可选参数,表示SSL证书验证开关,可以是True、False或CERT文件路径,默认为True。

  8. cert: 可选参数,表示SSL客户端证书文件路径,通常是一个包含证书和私钥的PEM文件,默认为None。

  9. allow_redirects: 可选参数,表示是否允许重定向,默认为True。

  10. stream: 可选参数,表示是否使用流式传输,默认为False。

  11. params_encoding: 可选参数,表示URL参数编码方式,如utf-8,默认为None

总之,requests.get提供了丰富的参数支持,可以满足各种HTTP请求场景需求。根据具体需求选择合适的参数进行配置即可。

你可能感兴趣的:(python学习,爬虫,python,学习)