使用python爬取某专科学校官方信息

发布时间:2024年01月17日
import csv
import os
import re
import time
from urllib.parse import urljoin

from bs4 import BeautifulSoup as bs
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

os.environ['HTTP_PROXY'] = 'http://127.0.0.1:10809'
os.environ['HTTPS_PROXY'] = 'http://127.0.0.1:10809'


cs = open('fzmjtc.csv','w', encoding='utf-8',newline='')
#指定newline=''参数,可以使每次写入数据不会产生空行
writer = csv.writer(cs)
#csv写入初始化成writer


dourl = "http://www.fzmjtc.cn/szxxgcxy/xsgz/xsdt.htm"


#网页内容过滤
def remove_css(text):
    pattern = re.compile(r'<[^>]+>', re.S)
    result = pattern.sub('', str(text))
    result = result.replace('\xa0', ' ')
    # 定义CSS字段的正则表达式模式
    pattern = r"\.(TRS_Editor [A-Z]+|)|(TRS_Editor [A-Z]+|)|(TRS_Editor [A-Za-z]+|)|(TRS_Editor \{.*?\})"
    # 删除文本中的CSS字段
    result = re.sub(pattern, '', result )
    pattern = r"{.*?}"
    result = re.sub(pattern, '', result)
    return result

def get_page_url(urls):
    driver.get(urls)
    time.sleep(2)
    html = driver.page_source
    soup = bs(html, features="html.parser")
    lu = soup.select('body > div.content.fl.clearFix > div > div.right-list.fr > div.list-con.fl > ul')
    hrefs = lu[0].find_all('a')

    for k in hrefs:
        infourl = urljoin(urls, k['href'])
        get_page_info(infourl)
    return urls

def get_page_info(urls):
    driver.get(urls)
    time.sleep(4)
    html = driver.page_source
    soup = bs(html, features="html.parser")
    #print(soup)

    try:
        title = soup.select('body > div.content.fl.clearFix > form > div.content-title.clearFix > h3' )[0].string
    except:
        title = None

    try:
        publicdate =  soup.select('body > div.content.fl.clearFix > form > div.content-title.clearFix > i')[0]
        publicdate=remove_css(publicdate)
        pattern = r'发布日期:(\d{4}-\d{2}-\d{2})'
        date_match = re.search(pattern, publicdate)
        publicdate=date_match.group(1)
    except:
        publicedate = None

    try:
        con =  soup.select('#vsb_content_4' )[0]
        con=remove_css(con)
    except:
        con  = None


    pattern = re.compile(r'<[^>]+>', re.S)
    con = pattern.sub('', str(con))

    wang_buff = ''
    fan_buff = ''

    result_list = [title,publicdate,con]

    result2_list =[]
    for k in result_list:
        print(k)
        if k is not None:
            result2_list.append(k)
        else:
            result2_list.append(None)
    #写入CSV
    writer.writerow(result2_list)


def get_next_url(urls):
    driver.get(urls)
    time.sleep(4)
    html = driver.page_source
    soup = bs(html, features="html.parser")
    lu = soup.select('body > div.content.fl.clearFix > div > div.right-list.fr > div:nth-child(6) > table > tbody > tr > td > table > tbody > tr')
    hrefs = lu[0].find_all('a')
    for k in hrefs:
        if k.text=='下页':
            urls = urljoin(urls, k['href'])
            break
    return urls




# options = webdriver.ChromeOptions()
#
# # -- 防止被检测,旧版本用法(1):
# # chrome在79版之前用这个
# options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_experimental_option('useAutomationExtension', False)
# options.binary_location='E:/program/chrome-win/chrome.exe'
#
# driver = webdriver.Chrome(options=options)

# -- 防止被检测,新版本用法(2):
# chrome在79和79版之后用这个








#get_page_info('http://www.nhc.gov.cn/xcs/yqtb/202206/0e3cf932d3ae43469e947d7fb97353db.shtml')
#print(get_next_url("http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml"))


if __name__ == '__main__':
    # 创建一个Chrome选项实例
    chrome_options = Options()
    # 指定Chrome浏览器的路径
    chrome_options.binary_location = "E:/program/chrome-win/chrome.exe"  # 更新为您的Chrome路径
    # 创建Service对象
    service = Service('chromedriver.exe')  # 更新为您的chromedriver路径
    # 使用指定的选项创建webdriver实例
    driver = webdriver.Chrome(service=service, options=chrome_options)

    html = driver.page_source

    while True:
        get_page_url(dourl)
        nexturl=get_next_url(dourl)
        #print(nexturl,dourl)
        if(nexturl==dourl):
            break
        else:
            dourl=nexturl

    driver.close()
    driver.quit()

导入模块和代理设置:脚本开始时导入了必要的模块,如 csv, os, re, time, urllib.parse 中的 urljoin,bs4 中的 BeautifulSoup 和 selenium 中的 webdriver。同时为 HTTP 和 HTTPS 设置了代理。

CSV文件初始化:打开一个名为 ‘fzmjtc.csv’ 的CSV文件,用于存储提取的数据。文件以 UTF-8 编码写入,通过指定 newline=‘’ 参数,确保每次写入数据时不会产生空行。初始化了一个 CSV 写入器 writer。

定义目标URL:变量 dourl 存储了目标网站的URL。

网页内容过滤函数:remove_css 函数用于从提取的文本中去除 HTML 标签和 CSS 样式,使得提取的内容更为干净。

获取页面信息函数:

get_page_url:访问给定的URL,提取其中的链接,并对每个链接调用 get_page_info 函数以提取信息。
get_page_info:访问特定的URL,提取该页面的标题、发布日期和内容。
获取下一页URL函数:get_next_url 函数用于在分页的网站上找到“下一页”的链接,并返回该链接的URL。

Selenium WebDriver配置:脚本创建了一个 Chrome WebDriver 实例,用于自动化地打开网页并提取数据。

主逻辑:在 main 部分,脚本配置了 WebDriver,并在循环中不断访问新页面,直到没有更多页面可访问。在每个页面上,它调用 get_page_url 函数来提取信息,并将提取的数据写入之前初始化的CSV文件。

关闭WebDriver:在数据提取完成后,脚本关闭并退出了 WebDriver。

文章来源:https://blog.csdn.net/qw123456789e/article/details/135660016
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。