美文网首页
实战爬取简书网热评文章(基于lxml及多进程爬虫方法)

实战爬取简书网热评文章(基于lxml及多进程爬虫方法)

作者: libdream | 来源:发表于2018-12-26 09:00 被阅读0次

目标

爬取简书网“首页投稿”热评文章的信息,包括用户ID(author)、文章标题(title)、文章内容(content)、评论数(comment)、点赞数(like)和打赏数(rewards)。

网址

https://www.jianshu.com/c/bDHhpK

思路

(1)构造URL列表。

首先浏览网址,手动浏览网页时,发现没有分页的界面,可以一直浏览下去,这说明该网页使用了异步加载

打开360浏览器或谷歌浏览器,按F12进入开发者工具,选择Network选项卡,如图所示:

image

通过手动向下浏览网页,发现Network选项卡中加载了一些文件,如下图:

image

打开第1个加载文件,在Headers部分可以看到请求的URL,如下图:

image

Response部分可以看到返回的内容就是文章信息,如下图所示:

image

通过关注,只需修改page后面的数字即可返回出不同的页面,以此来构造URL。

(2)构造爬取信息的函数,爬取信息,保存到mongodb。

具体代码如下:

import time,re
from lxml import etree
import requests
from multiprocessing import Pool
import pymongo

client = pymongo.MongoClient('localhost', 27017)    #连接数据库
mydb = client['mydb']
jianshu_shouye = mydb['jianshu_shouye'] #创建数据库和数据集合

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36\
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

def getInfo(url):
    r = requests.get(url, headers=headers)
    selector = etree.HTML(r.text)
    infos = selector.xpath('//ul[@class="note-list"]/li')#获取大标签,以此循环
    for info in infos:
        try:
            author = info.xpath('div/div/a/text()')[0]#作者
            title = info.xpath('div/a/text()')[0]#标题
            content = info.xpath('div/p/text()')[0]#内容
            comment = info.xpath('div/div/a[2]/text()')[1].strip()#评论数,此处取出来的列表中有两个元素,第1个是换行符,因此取第2个
            like = info.xpath('div/div/span[1]/text()')[0]#点赞数
            rewards = info.xpath('div/div/span[2]/text()')#打赏数
            if len(rewards) == 0:
                reward = '无'
            else:
                reward = rewards[0].strip()
            data = {
                'author':author,
                'title':title,
                'content':content,
                'comment':comment,
                'like':like,
                'reward':reward,
                }
            jianshu_shouye.insert_one(data) #插入数据库
        except IndexError:
            pass

if __name__ == '__main__':
    urls = ['https://www.jianshu.com/c/bDHhpK?order_by=top&page={}'.\
            format(str(i)) for i in range(1,5)]
    pool = Pool(processes=2)#2进程
    pool.map(getInfo, urls)
    pool.close()
    pool.join()

相关文章

网友评论

      本文标题:实战爬取简书网热评文章(基于lxml及多进程爬虫方法)

      本文链接:https://www.haomeiwen.com/subject/pzuclqtx.html