使用requests获取图书信息

简单说明

爬取网站网址:'http://books.toscrape.com/',选择任意一个图书分类,爬取其详情页信息,分别为图书名、价格以及简介,保存到Mongodb当中

使用工具

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

基本实现思路

  1. 对网站网址:'http://books.toscrape.com/'发送请求,获取左侧分类全部的链接,其网页如下所示:
结果截图3.jpg
  1. 在获取到的各图书分类url列表中随便选择一个分类,这里选择mystery类别,但经过观察发现,当页面只有一页以内的结果时,网址猴子只能为index.html,但是当大于一页的时候,
    第一页后缀可以为index.html,也可以为page-1.html,第二页为page-2.html,依此类推,每一页放置的书籍最多为20本。因此可以这样做:
  • 先对页面进行请求,同时获取书籍的总量。
  • 使用书籍总量除以20(每一页最多放置的书籍),若小于1,则页面只有1页,若大于1,则页面有多页,
  • 将定义的page_num加上书籍总量除以20的商的整数部分,即可得知有多少页,如下图:
结果截图1.jpg
  • 其次,添加一个判断,将具有多页书籍的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)


结果截图

结果截图.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容