1. 准备工作
1.1安装requests1
在python的安装目录下的Scripts文件夹下打开命令提示符,使用pip install requests安装
1.2安装lxml
使用xpath解析需要安装lxml库,与上面方法相同,pip install lxml
1.3安装MongoDB
下载好msi文件后,双击开始安装
然后一直点next,点install。
如果安装目录下,没有data和log文件夹,新建data和log文件夹,在data下新建db文件夹,在log下新建mongod.log文件
在bin目录下打开命令提示符,运行MongoDB,mongod --dbpath “D:\workspace\MongoDB\server\4.0\data\db
2代码
import pymongo,requestsfrom lxml import etree
class zhihu_crawler:
def __init__(self):
pass
#获取网页
def get_html(self):
url = 'https://www.zhihu.com/explore'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
}
try:
#使用requests获取目标网页内容
req = requests.get(url = url , headers = headers)
return(req.text)
except:
print('failed to get html')
#解析获取到的网页
def parse_html(self,text):
#构建一个可以被xpath解析的对象
html = etree.HTML(text)
#获取问题
result = []
try:
#//div:表示匹配所有div标签
#[@class="explore-feed feed-item"]:表示匹配class属性值为explore-feed feed-item的标签
items = html.xpath('//div[@class="explore-feed feed-item"]')
#items是一个问题列表,所以遍历没一个问题单独获取数据
for item in items:
one = {} #新建一个空字典存放每条问题的数据
content = etree.HTML(etree.tostring(item))
#获取问题,/text():获取当前标签的文本值
title = content.xpath('//a[@class="question_link"]/text()')
#获取作者名,/@data-author-name:获取当前标签的data-author-name属性值
author = content.xpath('//div[@class="zm-item-rich-text expandable js-collapse-body"]/@data-author-name')
#获取答案开头
summary = content.xpath('//div[@class="zh-summary summary clearfix"]/text()')
#依次将数据放到每条答案的字典中
one.update(title = title[0])
one.update(author = author[0])
#获取答案发现是列表,处理一下成字符串
constr = ""
for i in summary:
constr = constr+i
one.update(summary=constr)
#将一条答案的数据添加到列表中
result.append(one)
return(result)
except:
print("failed to parse html")
#存放数据到MongoDB
def save_db(self,data):
#连接数据库
client = pymongo.MongoClient(host = 'localhost' , port = 27017)
#新建或指定使用的数据库
db = client.test
#指定使用的集合,格式:数据库名.集合名
collection = db.zhihu
#插入数据,多条数据用insert_many(列表),单条数据用insert_one(单条数据)
result = collection.insert_many(data)
test = zhihu_crawler()
html = test.get_html()
data = test.parse_html(html)
test.save_db(data)