Python第二试
2017-05-24 本文已影响58人
hasu
爬取简书首页信息,包括:标题,作者,发表时间,阅读量,评论数,点赞数,打赏数,所投专题
因为自己看过一篇别人写的爬取赶集网的信息,再加上也没事做,就想着模仿着试一试,反正做的过程中是很痛苦的,好多基础的都不会,就只能边查资料边学习了,硬着头皮弄了一天,终于有了结果。
先上结果图,存储在mongodb中。
爬取的数据
好了,记录一下做的过程吧。
1.查看要爬取页面的源码
经过查看元素,发现在 ul 标签下的不同的 li 对应不同的文章,而每个文章获取标题、作者等等的方法都一样,那只需获取这个文章列表,然后让他们执行相同的操作即可获得所需数据。
2.查找自己所需数据所在的标签范围
作者名和文章发布时间 标题 阅读量、评论数、点赞数和打赏数3.具体的爬取数据过程
#encoding=utf-8
import requests,pymongo
from bs4 import BeautifulSoup
def get_info(url):
r=requests.get(url) # 向服务器请求页面
r.encoding='utf-8' # 标明编码为utf-8,以免出现解码错误
soup=BeautifulSoup(r.text,'html.parser') # 以html.parser方式对页面进行解析
articlelist=soup.select('ul.note-list li') #获取首页文章列表
#print articlelist
for article in articlelist:
title=article.select('a.title')[0].text
author=article.select('a.blue-link')[0].text
date=article.select('span.time')[0].get('data-shared-at')
if article.find_all('a',attrs={'class':'collection-tag'}): #因为有些文章没有所属分类,所以先判断,以免获取为None
collection=article.select('div.meta a.collection-tag')[0].text
readnum=article.select('div.meta a:nth-of-type(2)')[0].text #:nth-of-type(n) 选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素.
if article.find_all('i',attrs={'class':'iconfont ic-list-comments'}):
commentnum=article.select('div.meta a:nth-of-type(3)')[0].text
else:
commentnum=0
else: #如果没有所属分类,那么阅读量就是第一个a标签里的内容
collection='所属分类无'
readnum=article.select('div.meta a:nth-of-type(1)')[0].text
if article.find_all('i',attrs={'class':'iconfont ic-list-comments'}):
commentnum=article.select('div.meta a:nth-of-type(2)')[0].text
else:
commentnum=0
likenum=article.select('div.meta span:nth-of-type(1)')[0].text
if article.find_all('i',attrs={'class':'iconfont ic-list-money'}):
money=article.select('div.meta span:nth-of-type(2)')[0].text
else:
money=0
data = {
'title' : title,
'author' :author,
'date': date,
'readnum' : readnum,
'commentnum' :commentnum,
'likenum' : likenum,
'money' : money,
'collection' : collection
}
jianshu.insert_one(data) #将获取的数据存入到数据库中
client = pymongo.MongoClient('localhost',27017) # 连接mongodb
test = client['test'] # 创建一个名叫test的数据库文件
jianshu = test['jianshu'] # 创建一个jianshu的表
get_info('http://www.jianshu.com/')