首页 > 其他分享 >数据爬取与可视化技术——urllib、XPath、lxml案例爬取新浪股票吧

数据爬取与可视化技术——urllib、XPath、lxml案例爬取新浪股票吧

时间:2024-03-16 14:31:03浏览次数:20  
标签:XPath lxml url filename 爬取 html page stock

shy:数据爬取与可视化技术系列已发文三篇了,更多爬虫技术请查看专栏文章。

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

数据爬取与可视化技术——使用XPath和lxml库爬取、解析、提取数据

shy:现已开辟专栏四个:C++、ACM、数据库系统概论、数据爬取与可视化技术,更多文章请关注主页@HUAYI_SUN Blog

文章目录

问题描述:

爬取新浪股票吧的数据,其URL格式为https://guba.sina.com.cn/?s=bar&name=sh000300&type=0&page=1。分析其URL格式,并注意查看response的编码。添加数据提取功能,要求报告股吧的标题、作者和发表时间,将以上三个属性封装成item对象,并将每页的item封装到items数组中。要求股票代码由用户输入,同时输入起始页和结束页,把爬取到的网页保存成html文件。

Code:

import urllib.parse
import urllib.request
# from requests import get, post
from lxml import etree
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",
        "Cookie": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    }	# 此处加入自己的Cookie
    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request)
    return response.read().decode('gbk')


def parse_page(html):
    # 标题: //*[@id="blk_list_02"]/table/tbody/tr[2]/td[3]/a/text()
    # 作者://*[@id="blk_list_02"]/table/tbody/tr[2]/td[4]/div/a/text()
    # 发表时间://*[@id="blk_list_02"]/table/tbody/tr[2]/td[5]/text()
    root = etree.HTML(html)
    lis = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr')
    # print(len(lis))
    items = []
    for i in range(2, len(lis) + 1):
        name = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr[' + str(i) + ']/td[3]/a/text()')
        price = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr[' + str(i) + ']/td[4]/div/a/text()')
        attr = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr[' + str(i) + ']/td[5]/text()')
        item = {"标题": name, "作者": price, "发表时间": attr}
        items.append(item)
    print(items)


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, "")
        # print(html)
        parse_page(html)
        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
from lxml import etree
import time
  • urllib.parse:用于解析 URL。
  • urllib.request:用于发送 HTTP 请求。
  • lxml.etree:用于解析 HTML。
  • time:用于处理时间。

load_page 函数

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",
        "Cookie": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    }	# 此处加入自己的Cookie
    request = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(request)
    return response.read().decode('gbk')
  • 功能:加载指定 URL 的页面内容。
  • 参数url 表示要加载的页面 URL,filename 表示要保存的文件名。
  • 返回值:返回解码后的 HTML 内容。

parse_page 函数

def parse_page(html):
    root = etree.HTML(html)
    lis = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr')
    items = []
    for i in range(2, len(lis) + 1):
        name = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr[' + str(i) + ']/td[3]/a/text()')
        price = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr[' + str(i) + ']/td[4]/div/a/text()')
        attr = root.xpath('//*[@id="blk_list_02"]/table/tbody/tr[' + str(i) + ']/td[5]/text()')
        item = {"标题": name, "作者": price, "发表时间": attr}
        items.append(item)
    print(items)
  • 功能:解析页面内容,提取帖子的标题、作者和发表时间。
  • 参数html 表示要解析的 HTML 内容。
  • 输出:打印解析后的帖子信息。

write_page 函数

def write_page(html, filename):
    print("正在保存", filename)
    with open(filename, 'w', encoding='gbk') as file:
        file.write(html)
  • 功能:将页面内容写入文件。
  • 参数html 表示要写入文件的 HTML 内容,filename 表示要保存的文件名。

sina_stock_spider 函数

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, "")
        parse_page(html)
        filename = f"D:\\sina_stock_{stock_code}_page_{page}.html"
        write_page(html, filename)
        time.sleep(1)
  • 功能:爬取页面内容并保存到本地文件。
  • 参数stock_code 表示股票代码,beginend 表示起始页和结束页。
  • 细节
    • 构建基本 URL,其中包含股票代码的占位符。
    • 遍历起始页到结束页的每一页:
      • 构建当前页的 URL。
      • 打印正在爬取的 URL。
      • 调用 load_page 函数加载当前页的内容。
      • 调用 parse_page 函数解析当前页的内容。
      • 构建保存当前页内容的文件名。
      • 调用 write_page 函数将当前页的内容写入文件。
      • 每次请求间隔 1 秒,以避免过快地向服务器发送请求。

主程序入口

if __name__ == "__main__":
    stock_code = input("请输入股票代码(如sh000300): ")
    begin = input("请输入起始页码:")
    end = input("请输入结束页码:")
    sina_stock_spider(stock_code, begin, end)
  • 功能:提示用户输入股票代码、起始页和结束页,并调用 sina_stock_spider 函数开始爬取操作。


标签:XPath,lxml,url,filename,爬取,html,page,stock
From: https://blog.csdn.net/weixin_52784450/article/details/136761546

相关文章

  • 【笔记】Python爬虫之Xpath、BS4解析
    1、Bs4解析#安装bs4importrequestsfrombs4importBeautifulSoup#1url=""resp=requests.get(url)#2.将请求到的数据变成BeautifulSoup对象sp=BeautifulSoup(resp.text,'lxml')#↑加.text↑固定lxml#————————————————......
  • c# 爬取汉字
    //下载页面源文件并将其转换成UTF8编码格式的STRING//stringmainData=Encoding.UTF8.GetString(wc.DownloadData(string.Format("你要采集的网页地址")));stringpath=Server.MapPath("data");FileStreamfs=newFileStream(path+&quo......
  • c#爬取图片
    staticvoidMain(string[]args){Stopwatchstopwatch=newStopwatch();//图片网址//https://www.ivsky.com/tupian/index_8.html//stringurl="https://cn.bing.com/images/search?q=%e6%84%8f%e5%a2%83%e5%9......
  • Python爬取免费IP代理时,无法解析到数据
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【ZXS】问了一个Python网络爬虫实战问题。问题如下:我这里遇到一个问题:【爬取免费IP代理时,无法解析到数据】,我通过xpath,css定位到了元素,但是在运行时返回空列表,请问我该怎么解决呀以下是解析数据的截图:他自......
  • 案例--某站视频爬取
    众所周知,某站的视频是:由视频和音频分开的。所以我们进行获取,需要分别获得它的音频和视频数据,然后进行音视频合并。这么多年了,某站还是老样子,只要加个防盗链就能绕过。(防止403)音视频合并用ffmpeg软件,需要设置环境变量。---soeasy  话不多说,直接上代码......
  • Selenium爬虫实践之爬取携程网北京旅游景点数据
    昨天我发布了一篇名为Selenium在爬虫中的应用的文章,今天补充一下Selenium爬虫实践,话不多说直接上代码。1.导包首先导入所需要的库:importhtmlimporttimefromlxmlimporthtmlfromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy 2.获取浏览......
  • 1 爬取7K小说网用户书架信息
    目录一、目标二、分析三、代码一、目标    爬取链接我的书架-17K小说网,并将书架信息中的作品的分类、书名、最新章节、作者这些信息一一存储在Mysql数据库中。二、分析    发现要先登录才能进入页面,所以到时候要用到Cookies和Session,登录后:右键......
  • python得scrapy提取数据 xpath注意事项
    在提取器过滤数据这个地方被坑了很久,确实有点坑,有点难以理解,多注意下就可以了。frommultiprocessingimportallow_connection_picklingfromscrapy.spidersimportSpiderfrom..itemsimportCnblogshaha01ItemclasscnblogSpider(Spider):name="cnblogsHAHA01"#定......
  • Selenium自动化爬取网页数据——Python实现
    Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE,MozillaFirefox,Safari,GoogleChrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作......
  • 爬取17k小说书架
    #登录->得到cookie#带着cookie去访问->得到数据#必须得把上面两个操作连起来#我们可以使用session进行请求->session你可以认为是一连串的请求,在这个过程中的cookie不会丢失说一说过程中遇到的问题:刚开始我按着视频做的时候他没有headers也没有报错直接就会显......