1. 程式人生 > 其它 >爬取學校新聞網站文章

爬取學校新聞網站文章

技術標籤:python

爬取學校新聞網站文章

爬取思路

第一步,用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 請求
在這裡插入圖片描述