数据爬取与可视化技术——使用urllib库爬取网页获取数据

xcx:什么是爬虫呀?

shy:如果说网络像一张网,那么爬虫就是网上的一只小虫子,在网上爬行的过程中遇到了数据,就把它抓取下来。

shy:网络爬虫是一种按照一定的规则,自动请求万维网网站并提取网络数据的程序或脚本。注意:这里的数据是指互联网上公开的并且可以访问到的网页信息,而不是网站的后台信息(没有访问权限的),更不是用户注册的信息(非公开的)。

hwjw:爬虫具体能做些什么呢?

shy:搜索引擎、爬取图片、爬取用户公开联系方式进行营销、爬取网站用户公开信息进行分析、收集金融信息做投资分析、自动去除网页广告……

syf:什么是urllib库?

shy:urllib是Python内置的HTTP请求库,他可以看作是处理URL的组件集合。下面这篇文章就是使用urllib库爬取网页获取数据。

问题描述:

爬取新浪股票吧的数据,其URL格式为https://guba.sina.com.cn/?s=bar&name=sh000300&type=0&page=3。分析其URL格式,并注意查看response的编码。要求股票代码由用户输入,同时输入起始页和结束页,把爬取到的网页保存成html文件。

Code:

import urllib.parse
import urllib.request
# from requests import get, post
import time
#enconding = 'utf-8'

def load_page(url, filename):
  headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
  }
  request = urllib.request.Request(url, headers=headers)
  response = urllib.request.urlopen(request)
  return response.read().decode('gbk')

def write_page(html, filename):
  print("正在保存", filename)
  with open(filename, 'w', encoding='gbk') as file:
      file.write(html)

def sina_stock_spider(stock_code, begin, end):
  base_url = "https://guba.sina.com.cn/?s=bar&name={}&type=0&page="
  for page in range(int(begin), int(end) + 1):
      url = base_url.format(stock_code) + str(page)
      print("正在爬取:", url)
      html = load_page(url, "")
      filename = f"D:\\sina_stock_{stock_code}_page_{page}.html"
      write_page(html, filename)
      time.sleep(1)


if __name__ == "__main__":
  stock_code = input("请输入股票代码(如sh000300): ")
  begin = input("请输入起始页码:")
  end = input("请输入结束页码:")
  sina_stock_spider(stock_code, begin, end)


分析:

导入模块

import urllib.parse
import urllib.request
import time
  • urllib.parse:用于处理URL,但在这段代码中并没有实际使用到。
  • urllib.request:用于发起网络请求和接收响应。
  • time:用于在每次爬取后暂停一段时间,以避免过于频繁的请求。

定义函数 load_page(url, filename)

这个函数用于发起网络请求并获取页面内容。

  • url:目标网页的URL。
  • filename:文件名,但在函数内部并未使用。
def load_page(url, filename):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"
    }
    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request)
    return response.read().decode('gbk')
  • 定义了一个headers字典,用于模拟浏览器请求,避免被服务器拒绝服务。
  • 使用urllib.request.Request创建一个请求对象,并传入自定义的headers
  • 使用urllib.request.urlopen发起请求并获取响应对象。
  • 读取响应内容,并使用decode('gbk')解码为字符串。新浪财经的页面使用gbk编码,所以这里我们使用gbk编码。

定义函数 write_page(html, filename)

这个函数用于将网页内容写入文件。

  • html:要写入文件的网页内容。
  • filename:目标文件的名称。
def write_page(html, filename):
    print("正在保存", filename)
    with open(filename, 'w', encoding='gbk') as file:
        file.write(html)
  • 打印正在保存的文件名。
  • 使用with语句打开文件,确保文件正确关闭。
  • 指定文件打开模式为'w',即写入模式。
  • 设置文件编码为gbk,新浪财经使用的是gbk编码。
  • html内容写入文件。

定义函数 sina_stock_spider(stock_code, begin, end)

这个函数是爬虫的主要逻辑部分,用于爬取指定股票代码、起始页码和结束页码之间的所有页面。

def sina_stock_spider(stock_code, begin, end):
    base_url = "https://guba.sina.com.cn/?s=bar&name={}&type=0&page="
    for page in range(int(begin), int(end) + 1):
        url = base_url.format(stock_code) + str(page)
        print("正在爬取:", url)
        html = load_page(url, "")
        filename = f"D:\\sina_stock_{stock_code}_page_{page}.html"
        write_page(html, filename)
        time.sleep(1)
  • 定义基础URL,其中{}会被股票代码替换。
  • 使用for循环遍历起始页码到结束页码之间的所有页面。
  • 构建具体的URL,通过format方法将股票代码和页码插入到URL中。
  • 打印正在爬取的URL。
  • 调用load_page函数获取页面内容。
  • 构建文件名,并指定保存路径。
  • 调用write_page函数将内容写入文件。
  • 使用time.sleep(1)暂停一秒钟,避免过于频繁的请求。

主程序部分

if __name__ == "__main__":
    stock_code = input("请输入股票代码(如sh000300): ")
    begin = input("请输入起始页码:")
    end = input("请输入结束页码:")
    sina_stock_spider(stock_code, begin, end)
  • 当该脚本作为主程序运行时,会执行此部分代码。
  • 通过input函数获取用户输入的股票代码、起始页码和结束页码。
  • 调用sina_stock_spider函数开始爬取数据。

注意事项和潜在问题

  1. 编码问题

    • load_page函数中,使用decode('gbk')解码页面内容。如果新浪财经的页面编码发生变化,或者不是所有页面都使用gbk编码,这可能会导致解码错误。最好是先检查页面的实际编码,或者使用更通用的解码方法(如utf-8),或者根据响应头中的Content-Type字段来确定编码。
  2. 异常处理

    • 代码中没有异常处理机制。网络请求可能会因为各种原因失败,比如网络连接问题、服务器错误等。应当添加try-except块来捕获和处理可能出现的异常。
  3. 请求频率和限制

    • time.sleep(1)用于在每次请求后暂停一秒钟。这有助于避免对服务器造成过大的压力,但也可能导致爬虫速度过慢。如果服务器对请求频率有严格限制,可能需要调整这个时间间隔。
    • 另外,服务器可能会通过检查请求的User-Agent或其他头信息来识别爬虫,并拒绝服务。如果发生这种情况,可能需要进一步伪装爬虫,比如使用更复杂的User-Agent字符串或旋转User-Agent
  4. 文件路径

    • 代码中硬编码了文件保存路径为D:\\sina_stock_{stock_code}_page_{page}.html。这意味着所有文件都将保存在D盘根目录下,且需要有写入权限。在实际应用中,最好使用相对路径或提供路径的输入选项。
  5. 资源消耗

    • 对于大量页面的爬取,可能会占用大量的磁盘空间和网络带宽。需要确保系统资源足够,并考虑爬取后的数据处理和存储方式。
  6. 爬虫合规性

    • 在进行网络爬虫开发时,必须遵守目标网站的robots.txt文件规定以及相关法律法规。有些网站可能不允许或限制爬虫访问,确保你的爬虫行为合法合规。
  7. 更新和维护

    • 网络结构和页面布局可能会随时间发生变化。这意味着爬虫代码可能需要根据实际情况进行更新和维护,以确保其继续有效。
  8. 性能优化

    • 如果需要爬取的页面数量非常大,可能需要考虑使用多线程或异步IO来提高爬虫的效率。
    • 另外,如果目标网站支持API访问,使用API通常会比直接爬取页面更高效和稳定。
  9. 日志记录

    • 添加日志记录功能可以帮助跟踪爬虫的运行情况,包括成功爬取的页面、失败的请求、异常信息等。这对于调试和监控爬虫非常有帮助。
  10. 数据清洗和处理

    • 爬取下来的HTML数据可能需要进行进一步的数据清洗和处理,以提取出有用的信息。这通常涉及到使用正则表达式、XPath、BeautifulSoup等库来解析HTML结构。

在开发爬虫时,应当综合考虑以上因素,确保爬虫的稳定性、合规性和效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HUAYI_SUN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值