网易Python爬虫:爬取网易科技频道文章存入MySQL数据库
生活随笔
收集整理的這篇文章主要介紹了
网易Python爬虫:爬取网易科技频道文章存入MySQL数据库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一篇博客里答應的,第二篇會用 pymysql 直接將數據存入 MySQL 數據庫。
代碼部分只注釋了數據庫操作的部分,爬蟲部分有時間會補上。
網易科技頻道 以獨特視角呈現科技圈內大事小事,內容包括互聯網、IT業界、通信、趨勢、科技訪談等。
下面以 網易科技-智能 首頁為例,爬取文章的【鏈接–標題–發布時間–作者來源–具體內容】等信息并存入MySQL:
網頁分析
按【F12】鍵進入谷歌瀏覽器開發者工具,查看 Network – All:
點擊【加載更多】按鈕則出現第二個 smart_datalist.js ,對比觀察 URL 的不同可直接構造用于翻頁。
smart_datalist.js 中的內容包含 json 格式的數據:
后續再逐一訪問每篇文章的 docurl ,獲取全文即可。
安裝配置 MySQL
網上教程很多,請自行百度或Google。
完整代碼
#!/usr/bin/env python # -*- coding: utf-8 -*-""" 爬取【網易科技-智能】頻道首頁的【今日熱點】文章,并存入MySQL數據庫 @Update: 2019-03-20 @Author: Newyee @Python: 3.6.5 @MySQL : 8.0 """import requests from lxml import etree import re import time import pymysqlheaders = {'User-Agent': 'Mozilla/5.0 (Windows x86; rv:19.0) Gecko/20100101 Firefox/19.0'} pattern = re.compile(r' {20}(原標題.*)\n {16}') # 用于刪除文章開頭的“原標題”內容def get_html(url):try:r = requests.get(url, headers=headers)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept Exception as e:print(e)return 'Error'def get_content(doc_url):try:text = get_html(doc_url)html = etree.HTML(text)contents = html.xpath('//div[@class="post_text"]//p/text()')content = ''.join(contents)content = re.sub(pattern, '', content)return contentexcept Exception as e:print('Get content Error:', doc_url, e)def main(urls):# 打開數據庫連接(具體配置信息請自行替換)db = pymysql.Connect(host = 'localhost',port = 3306,user = 'root',password = 'root',db = 'test',charset = 'utf8')# 建表語句sql_create = "CREATE TABLE IF NOT EXISTS wangyi_tech (id INT(5) NOT NULL AUTO_INCREMENT," \"url VARCHAR(265),title VARCHAR(265),time VARCHAR(265),source VARCHAR(265),content VARCHAR(10240),"\"PRIMARY KEY (id) ) DEFAULT CHARSET=utf8"# 創建一個游標對象cursor = db.cursor()# 執行 SQL 建表語句cursor.execute(sql_create)count = 1for url in urls:print(url)text = get_html(url)results = eval(text.replace('data_callback(', '')[:-1])for result in results:doc_url = result['docurl']title = result['title']post_time = result['time']source = result['label'].strip()try:content = get_content(doc_url)except:continueprint(count, doc_url, title)# 插入語句sql = "INSERT INTO wangyi_tech (url,title,time,source,content) " \"VALUES ('%s','%s','%s','%s','%s')" % (doc_url, title, post_time, source, content)try:# 執行 SQL 插入語句cursor.execute(sql.replace('\n','\t'))except:print('Insert Error:', doc_url)# 如果發生錯誤則回滾db.rollback()# 提交到數據庫執行db.commit()count += 1time.sleep(1)time.sleep(2)# 關閉數據庫連接db.close()print('done')if __name__ == '__main__':url1 = ['http://tech.163.com/special/00097UHL/smart_datalist.js?callback=data_callback']urls = url1 + ['http://tech.163.com/special/00097UHL/smart_datalist_0{}.js?callback=data_callback'.format(str(n))for n in range(2, 10)]main(urls)運行結果
數據示例
ps. get_content(doc_url) 獲取文章全文對部分文章可能不適用或只獲取到部分內容
(猜測可能是因為網易的頻道或文章時間跨度比較大,網頁結構不統一)
行文倉促,注釋和講解部分不夠詳盡,如有疑問歡迎留言交流討論~~~
總結
以上是生活随笔為你收集整理的网易Python爬虫:爬取网易科技频道文章存入MySQL数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何避免软件行业的薪资天花板?
- 下一篇: linux cmake编译源码,linu