import requests
from lxml import etree
import pymongo
import time
''' 将爬取到的书保存到mongodb中,并导出文件(只爬取前9行,即90本书的信息)'''
class BookSpider(object):
def __init__(self):
self.base_url = 'http://www.allitebooks.com/page/{}/'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.20 Safari/537.36'
}
self.book_list_data = [] # 用来保存需要的数据
# 1.构建全部的url
def get_url(self):
url_list = [] # 保存全部的url
for i in range(1, 10):
url = self.base_url.format(i)
url_list.append(url)
return url_list
# 2.构建发送请求
def get_response(self, url):
response = requests.get(url=url, headers=self.headers)
data = response.content.decode('utf-8')
return data
# 3.解析数据
def parse_data(self, data):
# 先转译
xpath_data = etree.HTML(data)
# 先获取每本书的全部信息
book_list = xpath_data.xpath('//div[@class="main-content-inner clearfix"]/article')
# 获取每本书的书名、作者、链接
for book in book_list:
book_dict = {} # 保存每本书的数据
# 获取书名
book_dict['book_name'] = book.xpath('.//h2[@class="entry-title"]/a/text()')
# 获取作者
book_dict['book_auth'] = book.xpath('.//h5[@class="entry-author"]/a/text()')
# 获取书的链接
book_dict['book_html'] = book.xpath('.//h2[@class="entry-title"]/a/@href')
self.book_list_data.append(book_dict)
# 4.保存到数据库
def mongo_data(self):
# 1.链接到mongo的数据库
mongo_py = pymongo.MongoClient()
# 2.添加数据库和数据表
collection = mongo_py['six']['book']
# 3.插入到数据表中
collection.insert_many(self.book_list_data)
# 4.关闭数据库
mongo_py.close()
# 统筹调用全部数据
def start(self):
# 1.获取全部url
url_list = self.get_url()
# 2.发送请求
for url in url_list:
data = self.get_response(url)
# 3.解析
self.parse_data(data)
time.sleep(5.2)
# 4.保存到数据库
self.mongo_data()
if __name__ == '__main__':
BookSpider().start()
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.以上是python实现的代码
2.在mongodb上可以查看到已经导入成功:
然后可以导出文件:
在需要存放的文件夹中打开终端:
mongoexport -h 127.0.0.1:27017 -d six -c book -d book.csv --type csv -f book_name,book_auth,book_html
可以查看到导出成功的数据及数量:
打开csv文件验证: 导出成功。