当前位置:   article > 正文

抓取静态网页数据

抓取静态网页数据

      网络爬虫是用于自动抓取互联网上信息的程序。在Python中,有很多库可以用来编写网络爬虫,其中最基本和常用的是urllib库。下面我们将对urllib库进行初步的探索。

      一:什么是 urllib ?

              urllib 库是 Python 内置的 HTTP 请求库,它 可以看做是处理URL 的组件集合。                                           模块名称                       描述    
                        urllib.request                 请求模块    
                        urllib.error                     异常处理模块    
                        urllib.parse                   url 解析模块    
                        urllib.robotparser          robots.txt解析模块

      首先,我们需要导入urllib库:import urllib

  urllib库中的urlopen函数可以用来发送GET请求。以下是一个简单的例子:

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

     获取到网页的内容之后,我们需要对HTML进行解析以提取需要的信息。对于复杂的HTML,可以使用BeautifulSoup库来解析:

from bs4 import BeautifulSoup
import requests
response = requests.get('http://www.example.com')
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify())

        二:使用urllib库爬取网页

     Python2 中使用的是urllib2 库来下载网页,该库的用法如下所示:

import urllib2
response = urllib2.urlopen('http://www.baidu.com')

      注意:
Python3 出现后,之前Python2中的 urllib2 库被移到了urllib.request模块中,之前urllib2中很多函数的路径也发生了变化,希望大家在使用的时候多加注意。

    分析 urlopen 方法: urlopen 方法可以接收多个参数,定义格式如下:
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
参数如下:
url -- 表示目标资源在网站中的位置。
data -- 用来指明向服务器发送请求的额外信息。 timeout 一该参数用于设置超时时间,单位是秒。 context 一 实现 SSL加密传输,该参数很少使用。

     使用 HTTPResponse 对象
HTTPResponse 类属于http.client 模块,该 类提供了获取 URL、状态码、响应内容等一 系列方法。
geturl() -- 用于获取响应内容的URL,该方法可以验证发送的 HTTP 请求是否被重新调配。

info() -- 返回页面的元信息。
getcode() -- 返回HTTP 请求的响应状态码。
        构造 Request 对象
      在构建请求时,除了必须设置的 url 参数外,还可以加入很多内容,例如下面的参数参数如下:
1. data -- 默认为空,该参数表示提交表单数据,同时 HTTP 请求方法将从默认的GET 方式改为 POST 方式。 2.  headers -- 默认为空,该参数是一个字典类型,包含了需要发送的 HTTP 报头的键值对。

         三:使用urllib实现数据传输

        URL 编码转换

解码使用的是url.parse 库的 unquote 方法。

import urllib.parse
result =urllib.parse.unquote('a=%E4%BC%A0%E6%99%B/%E6%92%AD%E5%AE%A2') print(result)

        处理GET请求

GET 请求一般用于向服务器获取数据,比如说,我们用百度搜索传智播客。

此时,如果使用Fiddler查看 HTTP 请求,发现有个 GET 请求的格式如下:
https://www.baidu.com/s?wd=%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2

        处理POST请求

当访问有道词典翻译网站进行词语翻译时,会发现不管输入什么内容,其URL一直都是不变的。通过使用 Fiddler观察,发现该网站向服务器 发送的是 POST 请求。当使用有道词典翻译“Python”时,返回的结果是一个JSON 字符串。

        四:添加特定 Headers-请求伪装

如果不是从浏览器发出的请求,我们是不能获得响应内容的。针对这种情况,我们需要将爬虫程序发出的请求伪装成一个从浏览器发出的请求。

       五:代理服务器

       简单的自定义opener
我们可以使用代理服务器,每隔一段时间换一个代理。如果某个IP 被禁止,那么就可以换成其他 IP 继续爬取数据,从而可以有效解决被网站禁止 访问的情况。

        简单的自定义 opener
自定义 opener 需要执行下列三个步骤:
1.使用相关的 Handler 处理器创建特定功能的处理器对象  使用自定义的 opener    
 2. 通过 urllib.request.buildopener()方法使用这些处理器对象创建自定义的 opener 对象

3. 使用自定义的 opener 对象,调用open 方 法发送请求。  

注意:如果程序里所有的请求都使用自定义的 opener,可以使用urllib2.install_opener()将自定义的 opener 对象定义为全局opener,表示之后凡是调用urlopen,都将使用自定义的 opener .


         六:requests库

      抓取静态网页的技术:静态网页是HTML格式的网页,这种网页在浏览器中呈现的内容都会体现在源代码中,此时我们若要抓取静态网页的数据,只需要获得网页的源代码即可。
网络爬虫抓取静态网页数据的过程就是获得网页源代码的过程,这个过程模仿用户通过浏览器访问网页的过程,包括向Web服务器发送HTTP请求、服务器对 HTTP 请求做出响应并返回网页源代码。

       发送 GET 请求

在Requests库中,GET 请求通过调用get() 函数发送,该函数会根据传入的URL构建一个请求(每个请求都是Request类的对象),将该请求发送给服务器。get()函数的声明如下:
get(url, params=None, headers=None, cookies=None,
verify=True, proxies=None, timeout=None, **kwargs)
1.url:必选参数,表示请求的URL.
2.params:可选参数,表示请求的查询字符串。
3.headers :可选参数,表示请求的请求头,该参数只支持字典类型的值。
4.cookies :可选参数,表示请求的Cookie信息,该参数支持字典或CookieJar 类对象。5.verify:可选参数,表示是否启用 SSL证书,默认值为True。
6.proxies:可选参数,用于设置代理服务器,该参数只支持字典类型的值。

7.timeout :可选参数,表示请求网页时设定的超时时长,以秒为单位。

这段代码首先使用requests库获取网页内容,然后使用BeautifulSoup库将内容解析为DOM树,最后打印出树的遍历结果。

     我们可以通过选择特定的DOM元素来抓取数据。以下面的例子为例,我们假设网页上有一个表格,我们想要抓取这个表格的数据:

        from bs4 import BeautifulSoup
        import requests
        response = requests.get('http://www.example.com')
        soup = BeautifulSoup(response.text, 'html.parser')
        table = soup.find('table') # 找到表格元素
        rows = table.find_all('tr') # 找到表格中的所有行
        for row in rows:
        cols = row.find_all('td') # 找到行中的所有单元格
        for col in cols:
        print(col.text) # 打印单元格的数据

   处理响应:在Requests 库中,Response类的对象中封装了服务器返回的响应信息,包括响应头和响应内容等。除了前面介绍的status_code属性之外,Response类中还提供了一些其他属性。

                                      属性                         说明    
                             status code            获取服务器返回的状态码    
                             text                        获取字符串形式的响应内容    
                             content                  获取二进制形式的响应内容    
                             url                          获取响应的最终URL    
                             request                  获取请求方式    
                             headers                 获取响应头    
                             encoding               设置或获取响应内容的编码格式,与text属性搭配使用    
                             cookies                  获取服务器返回的Cookies

注意事项:

1.在抓取网页数据时,遵守网站的使用条款和条件,确保你的行为合法且不侵犯他人的权益。

2.频繁地抓取网页数据可能会被视为攻击行为,并可能导致你的IP地址被封禁。因此,请谨慎使用这种方法,并确保你的行为符合相关法律法规。

3.注意网页的更新频率和数据的有效期。有些网页会定期更新数据,因此你需要了解数据的更新周期以便及时获取最新数据。

4.抓取网页数据时可能会遇到网页结构的改变、页面错误或异常情况。因此,建议你在代码中添加异常处理机制以提高程序的鲁棒性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/808665
推荐阅读
相关标签
  

闽ICP备14008679号