获取免费图书信息保存到Mongodb数据库中

简单说明

网址:‘http://books.toscrape.com/’

使用工具和模块

1.PyCharm
2. lxml: ~
3. pymongo: pip install requests -i https://pypi.douban.com/simple
4. Mongodb:略~

基本实现思路

  1. 对网址发送请求,获取左侧分类全部的链接,其网页如下所示:

在这里插入图片描述

  1. 在获取到的各图书分类url列表中随便选择一个分类,这里选择mystery类别,但经过观察发现,当页面只有一页以内的结果时,网址猴子只能为index.html,但是当大于一页的时候,
    第一页后缀可以为index.html,也可以为page-1.html,第二页为page-2.html,依此类推,每一页放置的书籍最多为20本。因此可以这样做:
  • 先对页面进行请求,同时获取书籍的总量。
  • 使用书籍总量除以20(每一页最多放置的书籍),若小于1,则页面只有1页,若大于1,则页面有多页,
  • 将定义的page_num加上书籍总量除以20的商的整数部分,即可得知有多少页,如下图:

在这里插入图片描述

  • 其次,添加一个判断,将具有多页书籍的url改变后缀即可
  1. 获取每一页书籍的详情链接,并完善整个链接,再对详情页进行请求,获取图书名、价格、详情内容即可
  2. 最后,将数据存储到Mongodb中

相关代码:

import requests
from lxml import etree
import pprint
from pymongo import MongoClient
import time

class BookInfo:
   def __init__(self):
       self.headers={
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36' }
       self.base_url='http://books.toscrape.com/'
       self.page_num = 1
       self.link_all='http://books.toscrape.com/catalogue/'

    #获取左侧每个标签的url
   def left_all_url(self):
       response=requests.get(self.base_url,headers=self.headers)
       #获取左侧图书分类的链接
       html=etree.HTML(response.text)
       link_left=html.xpath('//ul[@class="nav nav-list"]/li/ul/li/a/@href')
       # 获取左边完整链接
       url_all = [self.base_url + link_left[i] for i in range(len(link_left))]
       return url_all

   #获取某个类别的链接页面进行分析
   def page_content(self,link):
       mql_response = requests.get(link, headers=self.headers)
       # 获取result结果判断有多少页
       mql_html = etree.HTML(mql_response.text)
       result = mql_html.xpath('//div[@class="col-sm-8 col-md-9"]/form/strong[1]/text()')[0].strip()
       if int(result) / 20 > 1:
           self.page_num = self.page_num + int(int(result) / 20)
           print('该页面总共有%s页,共有%s条结果' %(self.page_num,result))
           now_url = '/'.join(link.split('/')[:-1]) + '/page-%s.html'


       else:
           print('该页面只有%s页,共有%s条结果' % (self.page_num,result))
           now_url = link
       return now_url

   def main(self,now_url):
       for i in range(1, self.page_num + 1):
           try:
              now_urll= now_url%i
           except:
               now_urll=now_url
           tb = requests.get(now_urll, headers=self.headers).text
           tb_response = etree.HTML(tb)
           #获取详情页链接
           xx_link = tb_response.xpath('//div[@class="image_container"]/a/@href')
           xx_links = [self.link_all + '/'.join(xx_link[i].split('/')[-2:]) for i in range(len(xx_link))]
           save_all = []
           for i in xx_links:
               finally_response = requests.get(i, headers=self.headers)
               finally_html = etree.HTML(finally_response.text)
               all = {}
               all['books_name'] = finally_html.xpath('//div[@class="col-sm-6 product_main"]/h1/text()')[0]
               all['money_price'] = finally_html.xpath('//div[@class="col-sm-6 product_main"]/p[1]/text()')[0][1:]
               all['content'] = finally_html.xpath('//article[@class="product_page"]/p/text()')[0]
               save_all.append(all)
               # pprint.pprint(save_all)
           self.connect_Mongodb(save_all)


   def connect_Mongodb(self,data):
       ##连接数据库
       client = MongoClient()
       # 创建数据库
       database = client['books']
       # 创建集合
       db = database['book_content']
       # 保存到mongodb数据库当中
       db.insert_many(data)




if __name__=='__main__':
   mql=BookInfo()
   a=mql.left_all_url()
   #可以随意选择一个分类进行
   b=mql.page_content(a[1])
   mql.main(b)


结果截图

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能变瘦的莫巧丽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值