'''## =========================================## Title: 4.1 爬取的信息入庫前去重## Author: 職教之光## Date: 2022-05-01## =========================================='''#!/usr/bin/python# -*- coding: UTF-8 -*-import osos.chdir('D:/3.DA/Finance Bigdata mining and analysis with Python') # 變更工作目錄print('項目工作目錄為:\n%s'% os.getcwd()) # 獲取當前工作目錄print(66 * '-') # 分割線import requestsimport reimport pymysqlimport time# UA代表訪問網(wǎng)站的瀏覽器是哪種瀏覽器,可以通過在地址欄中輸入“about:version”獲取# “\”是行連接符,headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \ AppleWebkit/537.36 (KHTML, like Gecko) \ Chrome/100.0.4896.127 Safari/537.36'} def baiduinfo(company, page): num = (page - 1) * 10 # 參數(shù)規(guī)律是(頁數(shù)-1)*10 url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=' + company + '&pn=' + str(num) web = requests.get(url, headers=headers, timeout=10).text # 設(shè)置超時為10s,避免程序掛死 # print(url) page_href = '<h3 class='news-title.*?<a href='(.*?)'' href = re.findall(page_href, web, re.S) # re.S作用是在使用findall()查找時,可以自動考慮到換行的影響,使得.*?可以匹配換行 page_title = '<h3 class='news-title.*?aria-label='(.*?)'' title = re.findall(page_title, web, re.S) page_date = '<span class='c-color.*?aria-label='發(fā)布于:(.*?)'' date = re.findall(page_date, web, re.S) page_source = '<span class='c-color-gray' aria-label='新聞來源:(.*?)'' source = re.findall(page_source, web, re.S) for i in range(len(title)): # range(len(title)),這里因為知道len(title) = 10,所以也可以寫成for i in range(10) title[i] = title[i].strip() # strip()函數(shù)用來取消字符串兩端的換行或者空格,不過這里好像不太需要了 title[i] = re.sub('<.*?>', '', title[i]) # 核心,用re.sub()函數(shù)來替換不重要的內(nèi)容 print(str(i + 1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')') print(href[i]) # 將數(shù)據(jù)存入數(shù)據(jù)庫 for i in range(len(title)): db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='python_data', charset='gb2312') cur = db.cursor() # 獲取會話指針,用來調(diào)用SQL語句 sql_1 = 'SELECT * FROM shlpractice1 WHERE company = %s' # 編寫SQL語句 cur.execute(sql_1, company) # 執(zhí)行SQL語句 data_all = cur.fetchall() # 提取全部數(shù)據(jù) title_all = [] # data_all得到的是一個大元組(和指定的某家公司相關(guān)的所有新聞信息), # 若要提取其中各個小元組(每條新聞的各項數(shù)據(jù))的第2個元素(新聞標題), # 就得利用data_all[j][1]的方式完成(data_all[j]提取小元組,data_all[j][1]提取小元組的第2個元素)。 for j in range(len(data_all)): title_all.append(data_all[j][1]) if title[i] not in title_all: sql_2 = 'INSERT INTO shlpractice1(company, title, href, source, date) VALUES (%s, %s, %s, %s, %s)' cur.execute(sql_2, (company, title[i], href[i], source[i], date[i])) db.commit() # 當改變表結(jié)構(gòu)后,更新數(shù)據(jù)表的操作 cur.close() db.close() companys = ['北京科銳', '新世界']# 為了防止程序因為偶然的異常而終止運行,使用try/except異常處理語句for company in companys: for i in range(4): try: baiduinfo(company, i+1) # i是從0開始的序號,所以要寫成i+1表示第幾頁 print(company + '第' + str(i+1) + '頁爬取成功!') except: print(company + '百度新聞爬取失?。?)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。