数据采集第三次作业

news/2025/1/17 15:59:46/文章来源:https://www.cnblogs.com/oolone/p/18516808

代码链接:第三次数据采集实践作业码云链接

1 作业1

1.1 作业要求

  • 指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线程的方式爬取。

  • 务必控制总页数(学号尾数2位)、总下载的图片数量(尾数后3位)等限制爬取的措施。

  • 输出信息: 将下载的Url信息在控制台输出,并将下载的图片存储在images子文件中,并给出截图。

  • 本次作业爬取了4399游戏中的图片(https://www.4399.com/flash/)

1.2 作业1 Gitee文件夹链接

1.3 代码思路和关键代码展示

1.3.1 items.py程序

  • 定义Item
class Work1Item(scrapy.Item):image_urls = scrapy.Field()image_index = scrapy.Field()

1.3.2 game.py程序

  • 限制域

  • 很重要!!!由于图片的url和要爬取的页面的url的域并不一样,所以要把图片的域也加上去,否则在爬取时就会报错,血的教训!!!

    allowed_domains = ["4399.com","5054399.com"]
  • 限制爬取数目,爬取149张(学号后三位)
    def __init__(self):self.image_count = 0  # 初始化已爬取Item计数器MAX_IMAGES = 149
  • 爬取页面中的url
 def parse(self, response):# 提取图片链接# 使用正则表达式匹配所有以.jpg或.png结尾的图片链接img_pattern = re.compile(r'src="([^"]+\.(jpg))"')image_urls = img_pattern.findall(response.text)for url in image_urls:if self.image_count < self.MAX_IMAGES:url = 'https:'+str(url[0])self.image_count += 1print(self.image_count,url)item = Work1Item()item['image_urls'] = urlitem['image_index'] = self.image_countyield item
  • 翻页处理,当达到限制数目或没有下一页时停止翻页
 #获取下一页的链接next_page = response.xpath('//div[@class="pag"]/a[contains(text(), "下一页")]/@href').extract_first()if next_page is not None and self.image_count < self.MAX_IMAGES:next_page="https://www.4399.com"+str(next_page)yield response.follow(next_page, callback=self.parse)

1.3.3 pipelines.py程序

  • 将图片下载至根目录的文件夹images中
           def item_completed(self, results, item, info):# 检查图像是否成功下载if not results:raise DropItem("Image download failed for {}".format(item['image_urls']))# 确定保存路径image_path = 'images'  # 本地目录if not os.path.exists(image_path):os.makedirs(image_path)# 将下载的图片保存到指定路径image_url = item['image_urls']image_name = image_url.split("/")[-1]  # 获取文件名image_save_path = os.path.join(image_path, image_name)# 将图片写入本地文件with open(image_save_path, 'wb') as f:response = requests.get(image_url)f.write(response.content)return item

1.3.4 settings.py设置

  • 设置多线程爬取

  • 设置图片存储目录

  • 开启管道

LOG_LEVEL = "WARNING"
# Obey robots.txt rules
ROBOTSTXT_OBEY = True
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32
# 设置图片存储目录
IMAGES_STORY = './images'
DOWNLOAD_DELAY = 3
ITEM_PIPELINES = {"work_1.pipelines.Work1Pipeline": 1,
}

1.4 结果展示

  • 控制台输出:

  • 持久化存储:

1.5 总结体会

  • 爬取图片最麻烦的地方就是需要注意爬取图片时图片url的域,在爬取时要注意在限制域里进行添加,有多个不同的域就都要添加

  • 翻页处理时,会发现直接使用xpth爬取下来的并不一定是直接下一页的url,需要进行一定的处理

2 作业2

2.1 作业要求

  • 熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取股票相关信息。

  • 候选网站:东方财富网(https://www.eastmoney.com/)

  • 输出信息:Gitee文件夹链接

2.2 作业2 Gitee文件夹链接

2.3 代码思路和关键代码展示

2.3.1 items.py程序

  • 定义item
class Work2Item(scrapy.Item):stock_code = scrapy.Field()  # 股票代码stock_name = scrapy.Field()  # 股票名称latest_price = scrapy.Field()  # 最新价price_change_percent = scrapy.Field()  # 涨跌幅price_change = scrapy.Field()  # 涨跌额transaction_volume = scrapy.Field()  # 成交量transaction_amount = scrapy.Field()  # 成交额amplitude = scrapy.Field()        # 振幅highest_price = scrapy.Field()  # 最高lowest_price = scrapy.Field()  # 最低opening_price = scrapy.Field()  # 今开previous_close = scrapy.Field()  # 昨收

2.3.2 middlewares.py程序

  • 使用selenium来处理数据
    def __init__(self, driver_name='chrome', driver_executable_path=None, driver_arguments=None):self.driver = Noneself.chrome_options = webdriver.ChromeOptions()self.chrome_options.add_argument('--headless')self.chrome_options.add_argument('--disable-gpu')if driver_arguments:for argument in driver_arguments:self.chrome_options.add_argument(argument)service = Service(executable_path=driver_executable_path)self.driver = webdriver.Chrome(service=service, options=self.chrome_options)

2.3.3 eastmoney.py程序

  • 设置 ChromeOptions
    def __init__(self):# 设置 ChromeOptionsoptions = Options()options.add_argument('--headless')  # 无头模式options.add_argument('--no-sandbox')options.add_argument('--disable-dev-shm-usage')# 初始化 WebDriverself.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)self.page = 0  # 设置页面数
  • 获取页面信息
# 使用 Selenium 获取页面self.driver.get(response.url)time.sleep(3)  # 等待页面加载# 获取页面内容sel = Selector(text=self.driver.page_source)table = sel.xpath('//table[@id="table_wrapper-table"]/tbody/tr')for tr in table:stock_code = tr.xpath('./td[position()=2]/a/text()').extract_first()stock_name = tr.xpath('./td[position()=3]/a/text()').extract_first()latest_price = tr.xpath('./td[position()=5]/span/text()').extract_first()price_change_percent = tr.xpath('./td[position()=6]/span/text()').extract_first()price_change = tr.xpath('./td[position()=7]/span/text()').extract_first()transaction_volume = tr.xpath('./td[position()=8]/text()').extract_first()transaction_amount = tr.xpath('./td[position()=9]/text()').extract_first()amplitude = tr.xpath('./td[position()=10]/text()').extract_first()highest_price = tr.xpath('./td[position()=11]/span/text()').extract_first()lowest_price = tr.xpath('./td[position()=12]/span/text()').extract_first()opening_price = tr.xpath('./td[position()=13]/span/text()').extract_first()previous_close = tr.xpath('./td[position()=14]/text()').extract_first()
  • 翻页处理
            try:next_button = self.driver.find_element("xpath", '//*[@id="main-table_paginate"]/a[2]')if "disabled" not in next_button.get_attribute("class"):next_button.click()  # 点击下一页# 使用 WebDriverWait 等待下一页加载WebDriverWait(self.driver, 10).until(EC.presence_of_element_located(("xpath", '//table[@id="table_wrapper-table"]/tbody/tr')))yield scrapy.Request(self.driver.current_url, callback=self.parse)else:break  # 如果“下一页”按钮不可用,停止翻页except Exception as e:break  # 如果发生异常,停止翻页

2.3.4 pipelines.py程序

  • 链接mysql,并插入到数据库中
    def process_item(self, item, spider):"""处理爬取到的项并插入数据库"""sql = """INSERT INTO stocks (stock_code, stock_name, latest_price, price_change_percent, price_change,transaction_volume, transaction_amount, amplitude, highest_price,lowest_price, opening_price, previous_close)VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""values = (item['stock_code'],item['stock_name'],item['latest_price'],item['price_change_percent'],item['price_change'],item['transaction_volume'],item['transaction_amount'],item['amplitude'],item['highest_price'],item['lowest_price'],item['opening_price'],item['previous_close'])self.cursor.execute(sql, values)self.connection.commit()  # 提交事务return item

2.4 结果展示

  • 控制台输出:

  • 持久化存储:

2.5 总结体会

  • 使用selenium和scrapy框架进行爬取,可以处理一些动态数据。

  • 由于该网站在翻页处理时,本身的url并没有发生变化,原来处理翻页的方法不在奏效,但使用selenium的鼠标点击可以处理该类情况。

  • pipelines1爬取后的数据与数据库进行连接并存储,方便数据的保存和可视化。

3 作业3

3.1、作业要求

  • 熟练掌握 scrapy 中 Item、Pipeline 数据的序列化输出方法;使用scrapy框架+Xpath+MySQL数据库存储技术路线爬取外汇网站数据。

  • 候选网站:中国银行网:https://www.boc.cn/sourcedb/whpj/

  • 输出信息:Gitee文件夹链接

Currency TBP CBP TSP CSP Time
阿联酋迪拉姆 198.58 192.31 199.98 206.59 11:27:14

3.2 作业3 Gitee文件夹链接

3.3 代码思路和关键代码展示

3.3.1 items.py程序

  • 定义item
class Work3Item(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()Currency = scrapy.Field()TBP = scrapy.Field()CBP = scrapy.Field()TSP = scrapy.Field()CSP = scrapy.Field()Time = scrapy.Field()

3.3.2 middlewares.py程序

  • 使用selenium处理数据
    def __init__(self, driver_name='chrome', driver_executable_path=None, driver_arguments=None):self.driver = Noneself.chrome_options = webdriver.ChromeOptions()self.chrome_options.add_argument('--headless')self.chrome_options.add_argument('--disable-gpu')if driver_arguments:for argument in driver_arguments:self.chrome_options.add_argument(argument)service = Service(executable_path=driver_executable_path)self.driver = webdriver.Chrome(service=service, options=self.chrome_options)

3.3.3 boc.py程序

  • 数据处理
    def parse(self, response):table = response.xpath('//div/table/tbody/tr')for tr in table[2:-1]:Currency = tr.xpath('./td[position()=1]/text()').extract_first()TBP = tr.xpath('./td[position()=2]/text()').extract_first()CBP = tr.xpath('./td[position()=3]/text()').extract_first()TSP = tr.xpath('./td[position()=4]/text()').extract_first()CSP = tr.xpath('./td[position()=5]/text()').extract_first()Time = tr.xpath('./td[position()=8]/text()').extract_first()print(Currency,TBP,CBP,TSP,CSP,Time)
  • 翻页处理
  # 翻页处理next_page = response.xpath('//div[@class="turn_page"]/ol/li[@class="turn_next"]/a/@href').extract_first()next_page = "https://www.boc.cn/sourcedb/whpj/" + str(next_page)print(next_page)self.page +=1if next_page is not None and self.page < 11:  # 直到页面没有或超过10页next_page = response.urljoin(next_page)yield scrapy.Request(next_page, callback=self.parse)else:self.logger.info(f'Reached maximum page limit: {self.page}')

3.3.4 pipelines.py程序

  • 将数据存储到mysql中
    def process_item(self, item, spider):sql = """INSERT INTO work3_data (currency, tbp, cbp, tsp, csp, time)VALUES (%s, %s, %s, %s, %s, %s)"""try:self.cursor.execute(sql, (item['Currency'],item['TBP'],item['CBP'],item['TSP'],item['CSP'],item['Time']))self.connection.commit()except mysql.connector.Error as e:self.connection.rollback()raise DropItem(f"Error processing item {item!r} - {e}")return item

3.5 结果展示

  • 控制台输出

  • 持久化存储

3.6 总结体会

  • 与作业2相差不大,在翻页处理上比作业二更加简单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824420.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记(十五):ArkUi-切换按钮 (Toggle)

概述: 提供状态按钮样式、勾选框样式和开关样式,一般用于两种状态之间的切换 一、创建单选框 接口形式如下: type为类型,支持三种 1、Switch 不包含子组件Toggle({type:ToggleType.Switch,isOn:true}) 2、Checkbox 不包含子组件Toggle({type:ToggleType.Checkbox,isOn:tru…

二维前缀和模板

二维前缀和模板 题目描述: 输入一个 n 行 m 列的整数矩阵,再输入 q个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式: 第一行包含三个整数 n,m,q 接下来 n 行,每行包含 m 个整数,表示…

图文并茂教你如何发布自己的NPM包(GitHub Packages npm 包发布)

前情提要 发布包到npm也好,到github packages仓库也好,都是一样的道理,只是仓库地址不一样而已,本文是将npm包发布到了GitHub Packages~ GitHub Packages 简介 GitHub Packages 是一种软件包托管服务,和npm类似,允许您私下或公开托管软件包,并将包用作项目中的依赖项。 …

采用gpio-mio的sdk文档编译petalinux

其余步骤都ok 到下面生成boot.bin文件时失败 在网上找到了类似的 部署运行petalinux系统镜像_default bitsream is not found, please specify a bi-CSDN博客 经发现为该文件为纯PS端 未用到pl端 所以在生成时需要去除 --fpga 这样就成功了

redis中知识以及面试题

一、非关系型数据库NoSql 如下四种类型都是非关系型数据库 1.键值存储数据库(Key-Value) 如redis,就是键值存储数据库 2.列存储数据库 如clickhouse是列存储 3.文档型数据库 4.图形数据库(Graph) 二、redis的特点 redis是一个高性能的非关系型数据库,其中的所有数据形式都…

考研打卡(3)

开局(3) 开始时间 2024-10-30 21:38:56 结束时间 2024-10-30 22:27:21呜呜今天体侧了数据结构设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行__躺 的分配和回收才能使得初始关键字序列变成有序序列。(武汉科技大学2014) A 3 B 4 C 5 D 8A 3答案…

学习笔记(十四):ArkUi-单选框 (Radio)

概述: 单选框组件,通常用于提供相应的用户交互选择项,同一组的Radio中只有一个可以被选中。 单选框组件不支持自定义样式 一、创建单选框 接口形式如下: value 为单选框名称,group为单选框所在组的名称,同一个组内最多只有一个单选框为选中状态Radio(options: {value: st…

【专题】2023-2024中国保险数字化营销调研报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p=38063 在时代浪潮的推动下,中国保险行业正经历着一场波澜壮阔的变革之旅。 2023 年,中国经济迈向高质量发展阶段,保险公司纷纷聚焦队伍转型,专业化、职业化代理人成为行业新方向。回顾保险代理人队伍发展,历经多次变革,从早期扩张到面临…

2024CCPC哈尔滨部分题解

赛时被评测机卡死了 M.奇怪的上取整求\(\sum_{i=1}^{n} f(n,i)\) \(Input\) 第一行一个整数\(T(1<=T<=10^3)\),表示数据组数 对于每组数据,一行一个整数\(n(1<=n<=10^9)\) \(Output\) 对于每组数据,输出一行一个整数,表示答案。 \(Sample\) 3 5 451 114514 ——…

基于thinkphp+fastadmin+uniapp的单商户商城

1 、 系统概述多平台的单商户多门店系统,支持微信公众号、微信小程序、h5网页、Android、IOS的购物商城,拥有强大灵活的店铺装修、自定义模板、多规格商品、运费模板、库存管理、全端分享等。2、技术栈thinkphp uniapp vue3 vite redis element-plus easy-wechat mysql3、 解…

什么是多态?面向对象中对多态的理解

多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许对象以多种形式出现。多态性使得同一个接口可以用于不同的数据类型,从而使得代码更加灵活和可扩展。简单来说,多态就是一个接口,一个类,一个抽象类,一个类里面的方法,不同类的同一个方法,都可以有多种…

HarmonyOS:DevEco Profiler调优工具

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18515687➤如果链接不是为敢技术的博客园…