第一個python爬蟲

樹莓派

上個月月末,入手了第一臺樹莓派函似。樹莓派是什么槐脏?沒有決定購買之前,只見過同事在玩撇寞,覺得很神奇顿天。研究后才知道這是一個微型電腦。

具體的就不在這里說了蔑担。到手之后折騰了兩天牌废,在樹莓派3b上搭建一套ubuntu系統(tǒng)。嗯啤握,這也是我第一次搭建和使用ubuntu鸟缕。

做什么呢

樹莓派到手了,用來做什么呢排抬?

一開始打算弄一弄深度學(xué)習(xí)懂从,嘗試了一下tensorflow和caffe,都失敗了蹲蒲,裝不上番甩。這套專為樹莓派使用的Ubuntu貌似有不少問題。

那就做點簡單的吧届搁,比如爬蟲缘薛。

之前做過的爬蟲是java版本的webmagic窍育,感覺不好用。這次打算嘗試一下python宴胧。反正國慶假期多漱抓,就趁機會把python也學(xué)習(xí)一下。

準備工作

python:

教程:http://www.runoob.com/python3/python3-tutorial.html

了解基本的語法恕齐,以及l(fā)inux下python的使用辽旋,包括版本切換、執(zhí)行python文件等檐迟。

Beautiful Soup:

教程:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

了解使用它獲取html內(nèi)容的相關(guān)方法。

MySQL-python

python連接mysql:http://www.cnblogs.com/fnng/p/3565912.html

爬什么內(nèi)容

在簡書搜了一下码耐,發(fā)現(xiàn)一個可以快速參考的文章:
http://www.reibang.com/p/be891e7e96e2

寫得比較詳細追迟,就決定依樣畫葫蘆爬簡書吧。

代碼實現(xiàn)

表結(jié)構(gòu):

/*
SQLyog Ultimate v12.4.3 (64 bit)
MySQL - 5.7.13-log : Database - scrapy_jianshu
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`scrapy_jianshu` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;

USE `scrapy_jianshu`;

/*Table structure for table `jianshu_article` */

DROP TABLE IF EXISTS `jianshu_article`;

CREATE TABLE `jianshu_article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `article_type` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章分類',
  `article_id` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '簡書上的文章id',
  `title` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `author` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `author_id` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '作者id',
  `abstract` text COLLATE utf8mb4_unicode_ci COMMENT '摘要',
  `content` mediumtext COLLATE utf8mb4_unicode_ci,
  `like_count` int(6) DEFAULT NULL COMMENT '點贊數(shù)',
  `reward_count` int(4) DEFAULT NULL COMMENT '打賞數(shù)',
  `comment_count` int(6) DEFAULT NULL COMMENT '評論數(shù)',
  `link` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文章鏈接',
  `read_count` int(11) DEFAULT NULL COMMENT '閱讀量',
  `create_time` datetime DEFAULT NULL COMMENT '發(fā)表時間',
  PRIMARY KEY (`id`),
  UNIQUE KEY `article_id` (`article_id`)
) ENGINE=InnoDB AUTO_INCREMENT=29782 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

python源碼:

#!/usr/bin/env python
#coding=utf-8

import requests
from bs4 import BeautifulSoup
import pymysql
from datetime import datetime

# 打開數(shù)據(jù)庫連接
db = pymysql.connect("192.168.0.102","root","root","scrapy_jianshu",charset="utf8")

# 使用 cursor() 方法創(chuàng)建一個游標(biāo)對象 cursor
cursor = db.cursor()

# MySQLdb正常情況下會嘗試將所有的內(nèi)容轉(zhuǎn)為latin1字符集處理骚腥,所以設(shè)置編碼如下
cursor.execute('SET NAMES utf8;') 
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')


# 推薦分類
recommendations='http://www.reibang.com/recommendations/collections?page=%d&order_by=recommend'


# 簡書分類
base_urls=[]
        

# 抓取函數(shù)
def scrapy_artilce(url):
    add_url=0
    n=1000#每個專題抓取最受歡迎的前1000篇文章
    while(n>0):
        try:
            add_url += 1
            n = n-1
            response=requests.request('get',url% add_url)
            page=response.content
            soup=BeautifulSoup(page,'html.parser')
            type="'"+soup.select("a.name")[0].get_text() #文章分類
            article_list = [article for article in soup.select("div.content")]
            for article in article_list:
                author=article.select("a.blue-link")[0].get_text()#文章作者
                author_id=article.select("a.blue-link")[0].get('href')#作者id
                title=article.select("a.title")[0].get_text()#文章標(biāo)題
                article_id=article.select("a.title")[0].get('href')#文章id
                abstract=article.select("p.abstract")[0].get_text()#文章摘要
                link="http://www.reibang.com"+article_id#文章鏈接

                # 抓取文章正文
                response1=requests.request('get',link)
                page1=response1.content
                soup1=BeautifulSoup(page1,'html.parser')

                content=''
                if len(soup1.select('.show-content')):
                    content=soup1.select('.show-content')[0].get_text()#文章內(nèi)容

                read=0 #文章閱讀量
                if len(article.select(".ic-list-read")):
                        read=article.select(".ic-list-read")[0].find_parent().get_text() #文章閱讀量
                read=int(read)

                comment=0 #文章評論量
                if len(article.select(".ic-list-comments")):
                        comment=article.select(".ic-list-comments")[0].find_parent().get_text() #文章評論量
                comment=int(comment)

                like=0 #文章點贊量
                if len(article.select(".ic-list-like")):
                        like=article.select(".ic-list-like")[0].find_parent().get_text() #文章點贊量
                like=int(like)

                reward=0 #文章贊賞數(shù)量
                if len(article.select(".ic-list-money")):
                        reward=article.select(".ic-list-money")[0].find_parent().get_text() #文章贊賞數(shù)量
                reward=int(reward)

                create_time=article.select(".time")[0].get('data-shared-at')#發(fā)表時間
                create_time=create_time.replace('T',' ')
                create_time=create_time.replace('+08:00','')
                create_time=datetime.strptime(create_time,"%Y-%m-%d %H:%M:%S")

                sql="insert into jianshu_article (title,article_id,article_type,author,author_id,abstract,like_count,reward_count,comment_count,link,read_count,content,create_time) \
                values ('%s','%s',%s','%s','%s','%s','%d','%d','%d','%s','%d','%s','%s')" % \
                (title,article_id,type,author,author_id,abstract,like,reward,comment,link,read,content,create_time)
                
                try:
                    cursor.execute(sql)
                    db.commit()
                except Exception as e:
                    print('錯誤sql:'+sql)
                    print(e)
                    db.rollback()
        except Exception as e:
            print(e)

# 開始抓取
add_url=1
while(add_url<50):#推薦專題沒有超過50個
    try:
        response=requests.request('get',recommendations% add_url)
        page=response.content
        soup=BeautifulSoup(page,'html.parser')
        tyle_list=[_type for _type in soup.select("div.collection-wrap")]
        
        for _type in tyle_list:
            _type_id=_type.select(".avatar-collection")[0].find_parent().get('href')
            type_link='http://www.reibang.com'+_type_id+'?order_by=top&page=%d'
            base_urls.append(type_link)
        
        add_url +=1
    except Exception as e:
            print(e)

for _type in base_urls:
    scrapy_artilce(_type)

# 關(guān)閉數(shù)據(jù)庫連接
db.close()

總結(jié)

這個簡單的爬蟲在樹莓派上跑了將近兩天敦间,按照各個專題內(nèi)文章的點贊數(shù)排序,已經(jīng)抓取了7w+文章束铭。

樹莓派的好處是便宜廓块,200多塊錢就可以搭建好的一臺linux服務(wù)器,而且耗電少契沫,持續(xù)運行也不怎么發(fā)熱带猴。

后來又想爬心聲論壇的內(nèi)容,于是就又寫了一個簡單點的:

#!/usr/bin/env python
#coding=utf-8

import requests
from bs4 import BeautifulSoup
import pymysql
from datetime import datetime
import re

# 打開數(shù)據(jù)庫連接
db = pymysql.connect("192.168.0.102","root","root","scrapy_jianshu",charset="utf8")

# 使用 cursor() 方法創(chuàng)建一個游標(biāo)對象 cursor
cursor = db.cursor()

# MySQLdb正常情況下會嘗試將所有的內(nèi)容轉(zhuǎn)為latin1字符集處理懈万,所以設(shè)置編碼如下
cursor.execute('SET NAMES utf8;') 
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')


# 按點擊最多排序
xinsheng_base_url='http://xinsheng.huawei.com/cn/index.php?app=forum&mod=List&act=index&class=461&order=viewcount&type=&sign=&special=&p=%d'
        

# 抓取函數(shù)
def scrapy_artilce(url):
    add_url=0
    while(True):
        try:
            add_url += 1
            response=requests.request('get',url% add_url)
            page=response.content
            soup=BeautifulSoup(page,'html.parser')
            type="'"+'' #文章分類
            article_list = [article for article in soup.select("div.font_box")]
            for article in article_list:
                author=article.select(".pro")[0].select("a")[0].get_text()#文章作者
                if len(article.select(".space_rz_blue")):
                    author=article.select(".space_rz_blue")[0].find_parent().get_text()#文章作者
                    author=author.replace(' ','')

                author_id=''#作者id

                title=article.select("p")[0].select('font')[0].select('a')[0].get_text()#文章標(biāo)題
                
                article_id=''#文章id
                abstract=''#文章摘要

                
                link=article.select("p")[0].select('font')[0].select('a')[0].get('href')#文章鏈接

                # 抓取文章正文
                response1=requests.request('get',link)
                page1=response1.content
                soup1=BeautifulSoup(page1,'html.parser')

                content=''
                if len(soup1.select('.bbs_info_right_text')):
                    content=soup1.select('.bbs_info_right_text')[0].get_text()#文章內(nèi)容
                    if len(content) == 0:
                        content=soup1.select('.bbs_info_right_text')[1].get_text()

                read=0 #文章閱讀量
                comment=0 #文章評論量
                if len(article.select('.pro_width')):
                        read=article.select('.pro_width')[0].get_text() #文章閱讀量
                
                if len(article.select('.iconReply')):
                        comment=article.select('.iconReply')[0].find_parent().get_text() #文章評論量

                read=int(read)
                comment=int(comment)

                like=0 #文章點贊量
                reward=0 #文章贊賞數(shù)量
                
                create_time='1970-01-01'
                if len(article.select('.pro')):
                    create_time=article.select('.pro')[0].get_text()#發(fā)表時間
                
                create_time= re.findall(r"\d{4}-\d{2}-\d{2}",create_time)[0]
                create_time=datetime.strptime(create_time,"%Y-%m-%d")


                sql="insert into xinsheng_article (title,article_id,article_type,author,author_id,abstract,like_count,reward_count,comment_count,link,read_count,content,create_time) \
                values ('%s','%s',%s','%s','%s','%s','%d','%d','%d','%s','%d','%s','%s')" % \
                (title,article_id,type,author,author_id,abstract,like,reward,comment,link,read,content,create_time)
                
                #print(sql)
                
                try:
                    cursor.execute(sql)
                    db.commit()
                except Exception as e:
                    print('錯誤sql:'+sql)
                    print(e)
                    db.rollback()
                
        except Exception as e:
            print(e)

# 開始抓取
scrapy_artilce(xinsheng_base_url)

# 關(guān)閉數(shù)據(jù)庫連接
db.close()

到目前為止拴清,也已經(jīng)從心聲論壇上抓取到了4w+文章。后續(xù)可以在這些數(shù)據(jù)的基礎(chǔ)之上做一些查詢和分析了会通。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末口予,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涕侈,更是在濱河造成了極大的恐慌沪停,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裳涛,死亡現(xiàn)場離奇詭異木张,居然都是意外死亡,警方通過查閱死者的電腦和手機调违,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門窟哺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人技肩,你說我怎么就攤上這事且轨「∩” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵旋奢,是天一觀的道長泳挥。 經(jīng)常有香客問我,道長至朗,這世上最難降的妖魔是什么屉符? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锹引,結(jié)果婚禮上矗钟,老公的妹妹穿的比我還像新娘。我一直安慰自己嫌变,他們只是感情好吨艇,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腾啥,像睡著了一般东涡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倘待,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天疮跑,我揣著相機與錄音,去河邊找鬼凸舵。 笑死祖娘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贞间。 我是一名探鬼主播贿条,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼增热!你這毒婦竟也來了整以?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤峻仇,失蹤者是張志新(化名)和其女友劉穎公黑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄咆,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡凡蚜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吭从。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朝蜘。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涩金,靈堂內(nèi)的尸體忽然破棺而出谱醇,到底是詐尸還是另有隱情暇仲,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布副渴,位于F島的核電站奈附,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏煮剧。R本人自食惡果不足惜斥滤,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勉盅。 院中可真熱鬧佑颇,春花似錦、人聲如沸草娜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驱还。三九已至,卻和暖如春凸克,著一層夾襖步出監(jiān)牢的瞬間议蟆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工萎战, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咐容,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓蚂维,卻偏偏與公主長得像戳粒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子虫啥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 第一次寫文章蔚约,有哪些不足希望指出,有哪個技術(shù)寫的有問題涂籽,可以一起學(xué)習(xí)苹祟。 環(huán)境:python3.5 外部的庫:req...
    起風(fēng)了dzj閱讀 2,291評論 0 3
  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個 Awesome - XXX 系列...
    aimaile閱讀 26,481評論 6 427
  • 看完電影,好多人會代入自己的青春评雌,我也是树枫,而且很強。電影里徐來喜歡兩個女生景东,兩個女生都喜歡他砂轻。我曾經(jīng)也喜歡過兩個女...
    最后的未來閱讀 246評論 0 1
  • 移動應(yīng)用程序[編輯]維基百科,自由的百科全書(重定向自手機軟件) 本條目需要擴充斤吐。(2013年2月11日)請協(xié)助改...
    半片殘楓閱讀 1,215評論 0 0
  • 一代宗師 紅色的雨搔涝,墜落在泥里 瞳孔中一閃而過的 掌影厨喂,掠起一片水幕 黑的長衫,白的短褂 泛黃的老照片 正襟危坐的...
    意娉婷閱讀 147評論 0 0