爬取学校官网新闻-bs与xpath的恩怨情仇

为了更好地学习《自然语言处理》这一门课,我们的老师叫我们组团去刷学校官网,我刚开始还以为很简单,事实证明,我错了,固执的凭借xpath去解析内容非常的难,还有我最后用bs4轻松解析,这个项目让我看清了xpath适合提取单个标签内的内容,而bs4明显适合去提取大段的内容,然后再通过join,strip,replace,split等内容就可以去掉转义字符,空格和转换为列表。

另外,老师也要求我们使用正则表达式,我用正则表达式去提取特定格式的时间还有在提取出来的文本内容中提取出最后一个括号内的内容,也就是发布人信息,虽然会有点偏颇,但是还是可以接受的;在之前使用xpath去提取内容的时候,我还发现table下的tbody不可以写入xpath,如果写进来会导致错误,这是因为tbody很可能是谷歌或者火狐浏览器自动加上去的,大坑!

下面附上源代码:

import requests
import re
from lxml import etree
from bs4 import BeautifulSoup
import time
import sys
#步骤一:提取网页内容
start_time=time.time()
# print(start_time)
url=‘http://web.fosu.edu.cn/school-news‘
#请求方式为get
rsp=requests.get(url)
soup = BeautifulSoup(rsp.text, "lxml")

#步骤二:提取想要的网页url
def geturl(rsp):
    html=etree.HTML(rsp.text)
    soup = BeautifulSoup(rsp.text, "lxml")
    # print(html)
    #获取想要的文章的url
    url=html.xpath(‘//li[@class="category-content"]/a/@href‘)
    # print(url)
    end_time = time.time()
    print(int(end_time-start_time),‘s‘)
    for i in url:
        go(i)

    # 获取下一页的url,观察页面可知a标签倒数第二个属性href就是下一页的url
    next_url = html.xpath(‘//div[@class="pagination"]/center/a[last()-1]/@href‘)[0]
    print(next_url)
    #设定停止程序的时刻
    if next_url==‘http://web.fosu.edu.cn/school-news/page/342‘:
        if html.xpath(‘//div[@class="pagination"]/center/a[@class="current"]/text()‘)[0]==‘343‘:
            sys.exit()#退出程序
    next(next_url)

#步骤三:通过url访问文章,获取标题,时间,发布人,内容
def go(url):
    rsp=requests.get(url)
    html=etree.HTML(rsp.text)
    soup = BeautifulSoup(rsp.text, "lxml")
    name=html.xpath(‘//div[@class="single-newstitle"]/text()‘)
    # print(name)
    time=re.compile(‘2\d\d\d-\d\d-\d\d‘).findall(str(html.xpath(‘//div[@class="single-newstime"]/text()‘)[0]))
    # print(type(time))
    for i in soup.find_all(‘div‘,class_=‘single-content‘):
        content=i.get_text()
    #在使用xpath爬取table的时候,不要写tbody,写入tbody会查找不到,因为这是Chrome和火狐浏览器自动加的标签,大坑!
    content = ‘‘.join(content).strip()#去掉所有的转移字符!
    content = content.replace(‘\n‘, ‘‘).replace(‘\t‘, ‘‘).replace(‘\xa0‘, ‘‘).replace(‘\r‘,‘‘)#去掉字符串里面的\ntxa转义字符

    try:
        people = re.findall(‘((.*?))‘, content)[-1]
        #因为选取的是最后一个小括号内的内容,所以发布人可能出错,并且有些新闻没有发布人
        people = people.split(‘*‘)
    except:
        people=[‘无‘]
        #可能出现爬取文本内容没有括号的情况,也允许这种误差,因此找不到的时候就设为[]
    content = content.split(‘*‘)#*是随便设置的一个字符串里面不可能存在的字符,为了把字符串转换为列表

    # print(name,time,people,content)
    #保存在csv文件中
    for i,j,k,l in zip(name,time,people,content):
        params=str((i,j,k,l))
        # print(params)
        with open(‘fosu.csv‘,‘a‘,encoding=‘utf-8‘)as f:
            f.write(params+‘\n‘)

#步骤四:访问下一页
def next(url):
    rsp=requests.get(url)
    geturl(rsp)

if __name__=="__main__":
    geturl(rsp)

  

原文地址:https://www.cnblogs.com/fodalaoyao/p/10466492.html

时间: 2024-09-30 06:26:06

爬取学校官网新闻-bs与xpath的恩怨情仇的相关文章

(原)爬取辽宁科技大学相关新闻---python爬虫入门

有人说大部分python程序员都是通过爬虫入门的或者都是由爬虫喜欢上python的.还有大部分人学爬虫都喜欢拿自己学校的网站练手.我就是基于以上两点开始的... ok,开始,首先你需要一点python基础,一点点基础就可以,找一本薄薄的书过一遍,可以上这来找找 http://wiki.woodpecker.org.cn/moin/PyBooks 看书不爽,那你上这来看看,几道简简单单的题做过之后,顿觉一览众山小 http://www.pythontutor.com/ 咱们不是一边学爬虫,一边学p

Python3从零开始爬取今日头条的新闻【一、开发环境搭建】

Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Python3从零开始爬取今日头条的新闻[四.模拟点击切换tab标签获取内容] Python3从零开始爬取今日头条的新闻[五.解析头条视频真实播放地址并自动下载] 所谓爬虫,就是通过编程的方式自动从网络上获取自己所需的资源,比如文章.图片.音乐.视频等多媒体资源.通过一定的方式获取到html的内容,再通过

第一篇博客(python爬取小故事网并写入mysql)

前言: 这是一篇来自整理EVERNOTE的笔记所产生的小博客,实现功能主要为用广度优先算法爬取小故事网,爬满100个链接并写入mysql,虽然CS作为双学位已经修习了三年多了,但不仅理论知识一般,动手能力也很差,在学习的空余时间前前后后DEBUG了很多次,下面给出源代码及所遇到的BUG. 本博客参照代码及PROJECT来源:http://kexue.fm/archives/4385/ 源代码: 1 import requests as rq 2 import re 3 import codecs

利用Scrapy爬取1905电影网

本文将从以下几个方面讲解Scrapy爬虫的基本操作 Scrapy爬虫介绍 Scrapy安装 Scrapy实例--爬取1905电影网 相关资料 Scrapy 爬虫介绍 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改.它也提供了多种类型爬虫的基类,如BaseSpider.sitemap爬虫等,最

Python爬取中国天气网天气

Python爬取中国天气网天气 基于requests库制作的爬虫. 使用方法:打开终端输入 "python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个"data.csv"文件,内容请参考链接:https://www.cnblogs.com/Rhythm-/p/9255190.html 运行效果: 源码: import sys import re import requests import webbrowser from

爬虫----爬取校花网视频

import requests import re import time import hashlib def get_page(url): print('GET %s' %url) try: response=requests.get(url) if response.status_code == 200: return response.content except Exception: pass def parse_index(res): obj=re.compile('class="i

python爬虫入门练习,使用正则表达式和requests爬取LOL官网皮肤

刚刚python入门,学会了requests模块爬取简单网页,然后写了个爬取LOL官网皮肤的爬虫,代码奉上 #获取json文件#获取英雄ID列表#拼接URL#下载皮肤 #导入re requests模块 import requestsimport reimport time def Download_LOL_Skin(): #英雄信息Json文件地址:https://lol.qq.com/biz/hero/champion.js #获取英雄信息列表 json_url = "https://lol.

简单爬取微医网

一.利用request和xpath爬取微医网 #!/usr/bin/env python # -*- coding: utf-8 -*- #author tom import requests from lxml import etree import pymongo #爬取微医网类 class DoctorSpider(): #初始化应该具有的一些属性 def __init__(self): self.headers={'User-Agent': 'Mozilla/5.0 (Windows N

selenium爬取煎蛋网

selenium爬取煎蛋网 直接上代码 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ES import requests import urllib.requ