数据采集与融合技术实验课程作业三
作业所属课程 | https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology |
---|---|
作业链接 | https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13287 |
gitee码云代码位置 | https://gitee.com/wang-qiangsy/crawl_project/tree/master/作业三 |
学号 | 102202106 |
目录
- 数据采集与融合技术实验课程作业三
- 任务①:
- 主要代码
- 作业心得
- 任务②:
- 主要代码
- 作业心得
- 任务③:
- 主要代码
- 作业心得
- 任务①:
任务①:
主要代码
## image_spider.py
class ImageSpider(scrapy.Spider):name = "image_spider"allowed_domains = ["weather.com.cn"]start_urls = ["http://www.weather.com.cn"]def parse(self, response):# Find all image URLs on the pageimg_urls = response.css('img::attr(src)').getall()img_urls = [response.urljoin(url) for url in img_urls] # Handle relative URLs# Print image URLs in consolefor img_url in img_urls:self.log(f"Image URL: {img_url}")# Yield image requestsfor img_url in img_urls:yield scrapy.Request(img_url, callback=self.save_image)def save_image(self, response):# Save each image in 'images' folderpath = 'images'os.makedirs(path, exist_ok=True)filename = os.path.join(path, response.url.split('/')[-1])with open(filename, 'wb') as f:f.write(response.body)self.log(f"Saved file {filename}")
运行后查看抓取的图片
作业心得
-
- Scrapy 框架的强大功能
Scrapy 是一个功能强大的网页抓取框架,它提供了许多方便的工具和方法来处理网页抓取任务。在这个项目中,我使用 Scrapy 来抓取天气网站上的所有图片,并将它们保存到本地。Scrapy 的 Spider 类和 Request 对象使得抓取和处理网页内容变得非常简单和直观。
- Scrapy 框架的强大功能
-
- 使用 CSS 选择器提取数据
在 parse 方法中,我使用了 CSS 选择器来提取页面上的所有图片 URL。CSS 选择器是一种非常强大的工具,它允许我们轻松地选择和提取网页中的特定元素。在这个项目中,我使用 response.css('img::attr(src)').getall() 来获取所有图片的 URL。
- 使用 CSS 选择器提取数据
-
- 处理相对 URL
在抓取网页内容时,经常会遇到相对 URL。为了确保我们能够正确地访问这些资源,我使用了 response.urljoin(url) 方法将相对 URL 转换为绝对 URL。这是一个非常重要的步骤,因为它确保了我们能够正确地下载和保存所有图片。
- 处理相对 URL
任务②:
主要代码
# stock_spider.py
def parse(self, response):# 提取 JSON 数据data = json.loads(response.text[response.text.find('(') + 1 : response.text.rfind(')')]) # 去除 JSONP 包裹for stock in data['data']['diff']:item = StockScraperItem()item['id'] = stock['f12']item['code'] = stock['f12']item['name'] = stock['f14']item['latest_price'] = stock['f2']item['price_change_percentage'] = stock['f3']item['price_change'] = stock['f4']item['volume'] = stock['f5']item['turnover'] = stock['f6']item['amplitude'] = stock['f7']item['high'] = stock['f15']item['low'] = stock['f16']item['today_open'] = stock['f17']item['yesterday_close'] = stock['f18']yield item
# pipelines.py
def process_item(self, item, spider):# 插入数据self.cursor.execute("""INSERT INTO stock_data (id, code, name, latest_price, price_change_percentage, price_change, volume, turnover, amplitude, high, low, today_open, yesterday_close)VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)ON DUPLICATE KEY UPDATE latest_price=VALUES(latest_price),price_change_percentage=VALUES(price_change_percentage),price_change=VALUES(price_change),volume=VALUES(volume),turnover=VALUES(turnover),amplitude=VALUES(amplitude),high=VALUES(high),low=VALUES(low),today_open=VALUES(today_open),yesterday_close=VALUES(yesterday_close)""", (item['id'],item['code'],item['name'],item['latest_price'],item['price_change_percentage'],item['price_change'],item['volume'],item['turnover'],item['amplitude'],item['high'],item['low'],item['today_open'],item['yesterday_close']))
运行查看MySQL中查看股票数据
作业心得
-
- 处理 JSON 数据
在 StockSpider 爬虫中,我需要从 API 响应中提取 JSON 数据。通过使用 Python 的 json 模块,我能够轻松地解析 JSON 数据,并提取所需的字段。在这个项目中,我使用 json.loads 方法解析 JSON 数据,并使用字典访问提取到的数据。
- 处理 JSON 数据
-
- 使用 Scrapy Item
为了更好地组织和管理抓取到的数据,我使用了 Scrapy 的 Item 类。在 StockScraperItem 中定义了各个字段,并在爬虫中将提取到的数据赋值给这些字段。这种方法不仅使代码更加清晰,还能确保数据的一致性和完整性。
- 使用 Scrapy Item
-
- 数据存储到 MySQL
在 StockScraperPipeline 中,我使用了 mysql.connector 模块将抓取到的数据存储到 MySQL 数据库中。通过在 open_spider 方法中建立数据库连接,并在 close_spider 方法中关闭连接,我确保了数据库连接的正确管理。在 process_item 方法中,我使用 SQL 语句将数据插入到数据库中,并使用 ON DUPLICATE KEY UPDATE 语句处理重复数据。
- 数据存储到 MySQL
任务③:
主要代码
# work3.pydef parse(self, response):data = response.body.decode()selector=scrapy.Selector(text=data) data_lists = selector.xpath('//table[@align="left"]/tr')for data_list in data_lists:datas = data_list.xpath('.//td')if datas != []:item = work3_Item()keys = ['name','price1','price2','price3','price4','price5','date']str_lists = datas.extract()for i in range(len(str_lists)-1):item[keys[i]] = str_lists[i].strip('<td class="pjrq"></td>').strip()yield item
# pipelines.py
class work3_Pipeline:def open_spider(self,spider):try:self.db = pymysql.connect(host='127.0.0.1', user='root', passwd='wq1233', port=3306,charset='utf8',database='forex')self.cursor = self.db.cursor()self.cursor.execute('DROP TABLE IF EXISTS bank')sql = """CREATE TABLE bank(Currency varchar(32),p1 varchar(17),p2 varchar(17),p3 varchar(17),p4 varchar(17),p5 varchar(17),Time varchar(32))"""self.cursor.execute(sql)except Exception as e:print(e)def process_item(self, item, spider):if isinstance(item,work3_Item):sql = 'INSERT INTO bank VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (item['name'],item['price1'],item['price2'],item['price3'],item['price4'],item['price5'],item['date'])self.cursor.execute(sql)self.db.commit()return item
运行查看MySQL查看外汇数据
作业心得
-
- 使用 XPath 提取数据
在 Work3Spider 爬虫中,我使用了 XPath 表达式来提取网页中的数据。XPath 是一种非常强大的工具,它允许我们轻松地选择和提取网页中的特定元素。在这个项目中,我使用 selector.xpath('//table[@align="left"]/tr') 来获取所有数据行,并进一步提取每行中的各个数据单元格。
- 使用 XPath 提取数据
-
- 使用 Scrapy Item
为了更好地组织和管理抓取到的数据,我使用了 Scrapy 的 Item 类。在 work3_Item 中定义了各个字段,并在爬虫中将提取到的数据赋值给这些字段。这种方法不仅使代码更加清晰,还能确保数据的一致性和完整性。
- 使用 Scrapy Item