Python 爬简书首页插入Mongo数据库

之前的文章是爬虫糗事百科并插入到MySQL数据库,使用的是BeautifulSoup解析静态网页,select(返回列表)、find_all(返回列表)和find(返回单个结果)以及正则定位获取网页数据,pymysql链接插入本地MySQL数据库。为了扩展自己的爬虫技能,今天的代码是爬虫异步加载的简书首页文章,使用的是lxml解析网页,XPath定位获取网页数据,以及pymongo链接插入本地Mongo数据库(之前不懂MongoDB,看到很多人都使用Mongo数据库存储爬虫数据,特别学习了一下,感觉这个非关系型数据库还是很好用的)。爬取的首页文章数据包括:标题,作者,发表时间,阅读量,评论数,点赞数,打赏数,所投专题,代码的完成参考了loading_miracle的文章,他的文章思路清晰,图文并茂,很适合学习!下面是程序代码,每一句都加了注释说明,方便整理思路,代码的写法存在许多不规范的地方,还请大家留言指教,谢谢。

import requests
from lxml import etree
#import re
import pymongo
#构建爬取简书首页的类
class JianshuSpider(object):
    #链接Mongo数据库
    client = pymongo.MongoClient('localhost', 27017)
    #创建数据库 mydb (应该叫连接数据库,比较创建数据库更合适)
    mydb = client['mydb']
    #创建数据表 jianshu
    jianshu = mydb['jianshu']
    #请求头
    headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
    }
    #创建一个数组,用以存储文章的id,作为异步加载的请求参数
    params = []
    #Class的构造函数(我习惯这么称呼它)
    def __init__(self):
        pass
    #获取异步加载的url的函数(15页),并请求数据
    def totalpage(self):
        for i in range(0,15):
            data = '&'.join(self.params)
            url = 'http://www.jianshu.com/?' + data + '&page={}'.format(i)
            self.get_data(url)
    #爬取数据,并插入Mongo数据库的函数
    def get_data(self,url):
        #模拟浏览器访问网页
        html = requests.get(url,self.headers).text
        #etree.HTML解析网页内容返回给respone
        response = etree.HTML(html)
        #获取请求文章的ID并存入数组并作为请求携带参数
        ids = response.xpath('//*[@id="list-container"]/ul/li')
        for one in ids:
            one = 'seen_snote_ids[]=' + one.xpath('@data-note-id')[0]
            self.params.append(one)
        #xpath得到所有包含目标内容的div的集合
        div_list = response.xpath('//*[@id="list-container"]/ul/li/div')
        #for循环分别读取d集合中的目标数据
        for div in div_list:
            #定位获取文章标题数据-->text()
            title = div.xpath('a/text()')[0]
            #定位获取作者名字数据-->text()
            author = div.xpath('div[1]/div/a/text()')[0]
            #定位获取发表时间数据-->非文本text()而是属性@
            release_time = div.xpath('div[1]/div/span/@data-shared-at')[0]
            #定位获取文章阅读量(用XPath无法定位获取数据)
            #reading_num = div.xpath('div[2]/a[2]/text()')[0]
            #定位获取文章评论数(用XPath无法定位获取数据)
            #comment_num = div.xpath('div[2]/a[3]/text()')
            #定位获取点赞数量
            like_num = div.xpath('div[2]/span/text()')[0]
            #打赏数和所投专题可能为None,顾需特别处理
            #判断所投专题
            flg1 = div.xpath('div[2]/a[1]/text()')[0]
            topic = div.xpath('div[2]/a[1]/text()')[0] if flg1!=None else ""
            #判断打赏数
            flg2 = div.xpath('div[2]/span[2]/text()')
            play_num = div.xpath('div[2]/span[2]/text()')[0] if len(flg2)>0 else 0
            #爬取数据后,构建数据字典
            data = {
                '标题':title,
                '作者':author,
                '发布时间':release_time,
                #'阅读数':reading_num,
                #'评论数':comment_num,
                '点赞数':like_num,
                '所投专题':topic,
                '打赏数':play_num
            }
            #向数据库插入数据
            self.jianshu.insert_one(data)
if __name__ == '__main__':
    #初始化简书爬虫这个类
    jssy_spider = JianshuSpider()
    #调用简书爬虫类的totalpage()函数
    jssy_spider.totalpage()

插入MongDB效果:

简书mongo.png

除文章的阅读数和评论数没有爬到,其他都插入到Mongo数据库中了,很奇怪不知道为什么用XPath无法定位获取这两类数据,尝试参照loading_miracle的文章改用正则表达式获取,但是发现自己使用正则获取数据后,分页异步加载的数据不正确。第一次使用XPath,很多定位技巧都不掌握,还请大神帮忙解决用XPath定位这两类数据。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容