目标
爬取简书网“首页投稿”热评文章的信息,包括用户ID(author)、文章标题(title)、文章内容(content)、评论数(comment)、点赞数(like)和打赏数(rewards)。
网址
https://www.jianshu.com/c/bDHhpK
思路
(1)构造URL列表。
首先浏览网址,手动浏览网页时,发现没有分页的界面,可以一直浏览下去,这说明该网页使用了异步加载。
打开360浏览器或谷歌浏览器,按F12进入开发者工具,选择Network选项卡,如图所示:

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

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

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

通过关注,只需修改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()
网友评论