1.挑选两个(一个静态网页爬取,一个动态网页爬取)进行重构 2.要求有数据爬取、存储、展示过程 3.数据爬取、存储、展示过程的在flask web程序中控制 4.数据存储在数据库中 5.程序代码分包、模块、类、函数编写 6.数据爬取、存储进度要在网页中展示出来 7.数据展示包括数据内容展示和图形化展示
时间: 2023-06-12 15:07:41 浏览: 159
好的,我可以为您提供一些关于静态网页和动态网页爬取的示例代码以及如何在 Flask 中控制数据爬取、存储和展示的建议。
首先,我们需要选择两个网站来进行爬取。对于静态网页,我们可以选择一个新闻网站,如新浪新闻,进行新闻标题和链接的爬取。对于动态网页,我们可以选择一个在线商城网站,如淘宝,进行商品信息的爬取。
以下是一个简单的 Python 爬虫示例代码,用于从新浪新闻网站上爬取新闻标题和链接:
```python
import requests
from bs4 import BeautifulSoup
url = 'https://news.sina.com.cn/'
res = requests.get(url)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
news_list = []
for news in soup.select('.news-item'):
title = news.select('.title')[0].text
link = news.select('.title')[0]['href']
news_list.append({'title': title, 'link': link})
```
这段代码使用了 requests 库和 BeautifulSoup 库来获取网页内容并解析。它首先发送一个 GET 请求到新浪新闻网站,然后使用 BeautifulSoup 库来解析 HTML 页面。接着,它选择了所有具有 class 为 'news-item' 的元素,并从中提取新闻标题和链接。最后,将新闻标题和链接添加到一个列表中。
对于动态网页的爬取,我们可以使用 Selenium 库。以下是一个简单的 Python 爬虫示例代码,用于从淘宝商城网站上爬取商品信息:
```python
from selenium import webdriver
url = 'https://www.taobao.com/'
driver = webdriver.Chrome()
driver.get(url)
search_box = driver.find_element_by_name('q')
search_box.send_keys('手机')
search_box.submit()
product_list = []
for product in driver.find_elements_by_css_selector('.J_MouserOnverReq'):
title = product.find_element_by_css_selector('.title').text
price = product.find_element_by_css_selector('.price').text
link = product.find_element_by_css_selector('.title a').get_attribute('href')
product_list.append({'title': title, 'price': price, 'link': link})
driver.quit()
```
这段代码使用了 Selenium 库来模拟浏览器行为,首先打开淘宝商城的网页,然后输入关键字“手机”并提交搜索。接着,它选择所有具有 class 为 'J_MouserOnverReq' 的元素,并从中提取商品标题、价格和链接。最后,将商品信息添加到一个列表中。
在 Flask 中,我们可以使用 Flask 的路由和模板来控制数据爬取、存储和展示过程。以下是一个简单的 Flask 应用程序示例代码,用于展示从数据库中读取数据并在网页中展示的过程:
```python
from flask import Flask, render_template
import sqlite3
app = Flask(__name__)
app.config['DATABASE'] = 'data.db'
def get_db():
db = sqlite3.connect(app.config['DATABASE'])
db.row_factory = sqlite3.Row
return db
@app.route('/')
def index():
db = get_db()
data = db.execute('SELECT * FROM news').fetchall()
return render_template('index.html', data=data)
if __name__ == '__main__':
app.run()
```
这段代码定义了一个 Flask 应用程序,并使用 SQLite 数据库。它首先定义了一个 get_db 函数来获取数据库连接,并将每一行数据作为一个字典返回。接着,它定义了一个路由函数 index,用于从数据库中获取新闻数据,并将其传递给模板 index.html 来渲染。最后,它运行了应用程序。
在模板文件 index.html 中,我们可以使用模板引擎来展示数据内容和图形化展示。以下是一个简单的模板文件示例代码,用于展示从数据库中读取的新闻标题和链接:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>News</title>
</head>
<body>
<h1>News</h1>
<ul>
{% for row in data %}
<li><a href="{{ row['link'] }}">{{ row['title'] }}</a></li>
{% endfor %}
</ul>
</body>
</html>
```
这段代码使用了模板引擎来展示数据,它首先定义了一个标题,然后使用 for 循环来遍历每一行数据,并将标题和链接展示为一个列表。
最后,我们需要将数据存储到数据库中。对于 SQLite 数据库,我们可以使用以下代码来创建新闻表和商品表:
```python
import sqlite3
db = sqlite3.connect('data.db')
db.execute('CREATE TABLE news (id INTEGER PRIMARY KEY, title TEXT, link TEXT)')
db.execute('CREATE TABLE products (id INTEGER PRIMARY KEY, title TEXT, price TEXT, link TEXT)')
db.commit()
db.close()
```
这段代码使用了 SQLite 数据库,首先创建了一个名为 data.db 的数据库,并创建了两个表格 news 和 products,每个表格包含一个主键 id,以及一些字段来存储新闻或商品的相关信息。
最后,我们可以将爬虫程序和 Flask 应用程序整合起来,使用定时任务来定时运行爬虫程序并将数据存储到数据库中。以下是一个简单的示例代码,用于每隔一小时运行一次新浪新闻和淘宝商品的爬虫程序:
```python
from apscheduler.schedulers.background import BackgroundScheduler
import time
def crawl_news():
# 爬取新浪新闻的代码
def crawl_products():
# 爬取淘宝商品的代码
scheduler = BackgroundScheduler()
scheduler.add_job(crawl_news, 'interval', hours=1)
scheduler.add_job(crawl_products, 'interval', hours=1)
scheduler.start()
while True:
time.sleep(1)
```
这段代码使用了 apscheduler 库来创建定时任务,首先定义了两个函数 crawl_news 和 crawl_products,分别用于爬取新浪新闻和淘宝商品的数据。接着,它创建了一个后台调度器,并添加了两个定时任务,每隔一小时运行一次。最后,它启动了调度器,并进入了一个死循环,使程序保持运行状态。
阅读全文