关于#爬虫#的问题:(80%)2.爬虫结果输出类型为json(10%)或者储存在MongoDB(20%)可以参考: 从中获得信息

项目要求:
针对现在网络中对于学生比赛信息的缺乏,例如“中国软件杯”大学生软件设计大赛、或是创业创新等相关竞赛,请利用爬虫整合赛事信息,并且提供有用信息:
1.爬取比赛标题、日期、比赛内容与网页连接,演示时比赛通知数据量不少于100。(80%)
2.爬虫结果输出类型为json(10%)或者储存在MongoDB(20%)
可以参考:http://bisai.172xiaoyuan.com/index.html 从中获得信息



import json
import requests
from lxml import etree
from urllib.parse import urljoin
from time import sleep


base_url = 'http://bisai.172xiaoyuan.com/plus/arcmulti.php'


def getHtmlContent(page=1):
    headers = {
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
        'Host': 'bisai.172xiaoyuan.com',
        'Refer': 'http://bisai.172xiaoyuan.com/index.html',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
    }
    params = {
        'mtype': 0,
        'pnum': page,
        'tagid': 'index'
    }
    data = requests.get(base_url, headers=headers, params=params).text
    if data:
        return data
    else:
        return None

def parseHtml(data):
    result = []
    html = etree.HTML(data)
    for item in html.xpath('//div[@id="z"]/ul'):
        activity_title = item.xpath('./li[1]/a/text()')[0]
        activity_date = item.xpath('./li[2]/span/text()')[1]
        activity_content = item.xpath('./p/text()')[0]
        activity_url = urljoin(base_url, item.xpath('./li[1]/a/@href')[0])
        result.append({
                '比赛标题': activity_title.strip(),
                '日期': activity_date.strip(),
                '比赛内容': activity_content.strip(),
                '网页链接': activity_url
            })
    return result


def main():
    results = []
    for i in range(1,10):
        content = getHtmlContent(page=i)
        if content:
            result = parseHtml(content)
            results.extend(result)
        sleep(3)   #不要爬的太快
    # print(results)    #这种方式就可以直接写入到mongo了
    print(json.dumps(results,ensure_ascii=False))


if __name__ == '__main__':
    main()



该回答引用ChatGPT
由于本项目需要爬取网页数据,因此需要使用Python语言编写爬虫程序。本项目中,我们将使用Python的requests和BeautifulSoup库来实现爬虫功能,使用pymongo库将数据存储到MongoDB数据库中。

首先,我们需要安装必要的Python库。可以使用以下命令来安装:

pip install requests beautifulsoup4 pymongo

接下来,我们可以编写Python代码来实现爬虫功能。以下是一个简单的爬虫程序示例:

import requests
from bs4 import BeautifulSoup
import pymongo

# 连接MongoDB数据库
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["competition"]
collection = db["notices"]

# 爬取中国软件杯大学生软件设计大赛通知
url = "http://www.cnsoftbei.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
notices = soup.find_all("div", class_="notice-item")

# 将爬取结果存储到MongoDB数据库中
for notice in notices:
    title = notice.find("a").text
    date = notice.find("span", class_="date").text
    content = notice.find("p").text
    link = notice.find("a")["href"]
    data = {
        "title": title,
        "date": date,
        "content": content,
        "link": link
    }
    collection.insert_one(data)

# 输出MongoDB中的数据
for data in collection.find():
    print(data)

在上述代码中,我们首先使用pymongo库连接到MongoDB数据库,并创建一个名为“competition”的数据库和一个名为“notices”的集合。然后,我们使用requests库发送HTTP请求,获取中国软件杯大学生软件设计大赛通知页面的HTML代码,并使用BeautifulSoup库解析HTML代码,提取出通知的标题、日期、内容和链接。最后,我们将提取出的数据存储到MongoDB数据库中,并输出MongoDB中的所有数据。

需要注意的是,上述代码只是一个简单的示例,实际应用中需要根据具体的需求进行修改和优化。同时,为了避免对网站服务器造成过大的负担,我们应该合理设置爬虫程序的访问频率和爬取数据的数量。