Advertisement

爬取学校新闻网站文章

阅读量:

该文本描述了从学校新闻网站爬取文章的完整流程,包括获取新闻目录、提取文章URL及标题、根据日期限制范围、从每篇文章获取其他信息(如作者、正文、浏览数)以及存入数据库。文本中提到在Chrome检查功能中发现新闻浏览数显示但无法爬取,最终发现是Ajax请求问题,并使用pandas库处理。摘要需简洁概括核心内容。

爬取学校新闻网站文章

  • 爬取思路
  • 遇到的问题

爬取思路

第一步,用requests获取新闻目录的网页源码。

复制代码
    def get_page(url):   #页面源代码
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    else:
        print("Fail to get page")
        
    url = "http://news.fzu.edu.cn/html/fdyw/" + str(offset) + ".html"
    html = get_page(url)

第二步,获取每一篇文章的url,并先提取日期、标题

复制代码
    def get_articles(html, new_list):
    doc = pq(html)
    articles = doc('.list_main_content li')
    
    get_articles(html, new_list)

第三步,通过日期限制爬取范围,并对每一则新闻的url发起get请求

复制代码
    if new["date"][:4] == "2020":   #只爬2020年
     new["title"] = article('a').text()  #标题
     url = 'http://news.fzu.edu.cn' + article('a').attr('href')
     html_new = get_page(url)
     get_other_data(html_new, new)
     new_list.append(new)
    elif new["date"][:4] == "2021":
     continue
    else:
     global flag
     flag = 1
     return

第四步,在每则新闻网页的源代码中获取剩下的信息,即作者、正文、浏览数

复制代码
    def get_other_data(html, new):
    doc = pq(html)
    data = doc('.detail_main_content')
    
    author = data('#author').text()  #作者
    new["author"] = author
    
    page_views_str = data('script').text()  #阅读数
    a1 = page_views_str.find("url")
    a2 = page_views_str.find("timeout")
    page_views_url = page_views_str[a1 + 5:a2 - 2]
    page_views_url = "http://news.fzu.edu.cn" + page_views_url
    page_views = requests.post(page_views_url).text
    new["page_views"] = page_views
    
    content = ""    #正文
    paragraphs = doc('#news_content_display')
    for p in paragraphs('p').items():
        content += p.text() + "\n"
    new["content"] = content

第五步,存入数据库

复制代码
    db = pymysql.connect(host='localhost', user='root', password='beli3579', port=3306, db='fzu_new')
    cursor = db.cursor()
    cursor.execute("DROP TABLE IF EXISTS news")
    sql = '''create table news(
        date varchar(20),
        title varchar(70),
        author varchar(50),
        page_views varchar(20),
        content varchar(3000)
    )'''
    cursor.execute(sql)
    for new in new_list:
      sql = 'insert into news(date,title,author,page_views,content) values(%s,%s,%s,%s,%s)'
      try:
          if cursor.execute(sql, tuple(new.values())):
            print('Success to the database')
            db.commit()
      except:
            print('Fail to the database')
            db.rollback()
    db.close()

遇到的问题

在这里插入图片描述

在使用Chrome的检查功能时,能够显示新闻的浏览数据,但无法获取完整的新闻内容。经过分析,问题源于该新闻内容采用了Ajax请求方式。

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~