本实例还有另外的在线爬虫实现,有兴趣可点击在线爬取当当网畅销书Top500的图书信息

爬虫说明

1.使用requests和Lxml库爬取,(用BS4也很简单,这里是为了练习Xpath的语法)
2.爬虫分类为两种,一种是在线爬虫,即在网站中一边打开网页一边进行爬取;第二种是本实例使用的离线爬虫,即先将所爬取的网页保存到本地,再从本地网页中爬取信息
3.离线爬虫的优点是:可以方便爬虫的调试修改,且一次保存,可以多次爬取,不必担心网络资源,网络速度以及是否被网站监测.
4.离线爬虫的缺点是:需要先进行网页的保存,如果爬取的网页比较多,那么需要保存到本地占用的空间就越大,而且文档还涉及到许多不必要的信息,浪费空间.其次是爬取链问题,如果需要在当前网页中爬取另一个网页(超链接),那么该网页也需要保存,并且需要指定存放的位置.最后是编码的问题,涉及了网页的编码,文件的读取保存编码的统一,这里可能会遇到一些编码问题需要处理.

爬虫介绍

本次爬虫爬取的网页为:
图书畅销榜-10月畅销书排行榜-当当畅销图书排行榜
爬取的信息包括图书的排名,书名,作者,好评率,购买页面以及ISBN
如图:

其中,ISBN需要在购买页面链接中继续爬取,找到ISBN

爬取之后的结果整理好存放到csv文件中.
最终成果如图:

爬虫代码

观察需要爬取的第一页和最后一页:
http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-month-2018-10-1-1
http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-month-2018-10-1-25
发现只有最后一个数字改了,且每页显示20本图书,所以25*20=500,搞定.
这里自己了一个spider.py,里面写了两个小函数,一个用于返回网站的编码格式,一个用来存放网页到本地(实现离线爬虫)

import requests
import redef get_encoding(url, headers=None):  # 一般每个网站自己的网页编码都是一致的,所以只需要搜索一次主页确定'To get website\'s encoding from tag<meta content=\'charset=\'UTF-8\'>'#从<meta>标签中获取res = requests.get(url, headers=headers)charset = re.search("charset=(.*?)>", res.text)if charset is not None:blocked = ['\'', ' ', '\"', '/']filter = [c for c in charset.group(1) if c not in blocked]return ''.join(filter)  # 修改res编码格式为源网页的格式,防止出现乱码else:return res.encoding  # 没有找到编码格式,返回res的默认编码def savepage(response, filepath,encoding='UTF-8'): #注意response=requests.get()response.encoding = encodingwith open(filepath, 'wb') as f:f.write(response.content)

dangdang_best_selling_offline.py中,代码如下:

import spider
import csv
import os
import requests
import time
from lxml import etreeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/''537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36'
}  # 设置headers
encoding = spider.get_encoding('http://www.dangdang.com', headers)  # 获取网站编码
urls = ['http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-month-2018-10-1-{}'.format(i) for i inrange(1, 26)] #构造网页# 保存书单页面与详细页面(离线保存)
for i in range(25):dirpath = 'd:/dangdang/2018-10-{}/'.format(i + 1) #先手动确保d:/dangdang 文件夹存在if not os.path.exists(dirpath):  # 子文件夹不存在则创建文件夹os.mkdir(dirpath)filepath = dirpath + 'list.html'if not os.path.exists(filepath):res = requests.get(urls[i], headers)spider.savepage(res, filepath, encoding)  # 保存当前书单页面time.sleep(0.5)  # 缓冲0.5秒,防止请求频率过快pattern = '//ul[@class="bang_list clearfix bang_list_mode"]/li/div[2]/a/@href'detail_url = etree.HTML(res.text).xpath(pattern)  # 获取每一本书的详细页面for id, url in enumerate(detail_url):  # 保存每本书的页面filepath = dirpath + '{}.html'.format(id + 1)res = requests.get(detail_url[id], headers)spider.savepage(res, filepath, encoding)time.sleep(0.5)

执行完上面的代码后(等待一段时间),就得到以下结果:

上述的是每一个页面对应一个文件夹,共25个
打开文件夹:

每个文件夹都有一个list.html,这是保存了当前页面的html,还有20个按序号排列的html,每一个html代表着一本书的单独页面用来获取ISBN,(除此以外还能够爬取很多信息,自己玩去)
下面是爬取和保存的代码:

# 保存所有页面后,进行离线爬虫的准备
if __name__ == '__main__':output = open('d:/dangdang/result.csv', 'w', newline='')  # 将信息导出到csv,设置newline=""去除写一行空一行的影响writer = csv.writer(output)  # csv writerwriter.writerow(('排名', '书名', '作者', '好评率', '购买页面', 'ISBN'))for page in range(25):dirpath = 'd:/dangdang/2018-10-{}/'.format(page + 1)with open(dirpath + 'list.html') as f:text = ''.join(f.readlines())selector = etree.HTML(text)booklist = selector.xpath('//ul[@class="bang_list clearfix bang_list_mode"]/li')book = [book for book in booklist]for i in range(len(book)):with open(dirpath + '{}.html'.format(i + 1)) as df:  # 打开保存书籍的详细页面d_text = ''.join(df.readlines())d_selector = etree.HTML(d_text)# text()是选出<a>xxx</a>中间的值,而@href 是选出href属性的值rank = book[i].xpath('div[1]/text()')[0]  # 排名site = book[i].xpath('div[2]/a/@href')[0]  # 购买/详细页面name = book[i].xpath('div[3]/a/text()')[0]  # 名字star = book[i].xpath('div[4]/span/span/@style')  # 以星星宽度决定好评author = book[i].xpath('div[5]/a/text()')  # 作者名ISBN = d_selector.xpath('//ul[@class="key clearfix"]/li[5]/text()')[0]  # 从详细页面中获取isbn# 数据的规格化,这里为了方便修改,分开未修改和已修改两部分rank = rank.replace('.', '')site = sitename = namestar = ''.join([x for x in star[0] if x.isdigit() or x == '.'])author = ' '.join(author)ISBN = ISBN.replace('国际标准书号ISBN:', '') + '\t' #去除在Excel中科学计数法的影响print(rank, name, author, star, site, ISBN)writer.writerow((rank, name, author, star, site, ISBN))  # 保存到csv

不多赘述,有兴趣可以copy下来慢慢玩,最好就是打开畅销书的网页,然后对照审查元素慢慢研究lxml. 另外要注意的细节都以注释形式保存了.

Python爬虫 离线爬取当当网畅销书Top500的图书信息相关推荐

  1. Python爬虫 在线爬取当当网畅销书Top500的图书信息

    本实例还有另外的离线爬虫实现,有兴趣可点击离线爬取当当网畅销书Top500的图书信息 爬虫说明 1.使用requests和Lxml库爬取,(用BS4也很简单,这里是为了练习Xpath的语法) 2.爬虫 ...

  2. Python爬虫深入 爬取当当网商品基本信息

    Python爬虫深入 爬取当当网商品基本信息 使用scrapy爬虫框架,创建爬虫项目. 基本命令: scrapy startproject dangdang scrapy genspider -l s ...

  3. python爬虫之--爬取当当网商品信息

                                    python爬虫之--爬取当当网图商品信息                                               ...

  4. java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等)

    java爬取当当网所有分类的图书信息(ISBN,作者,出版社,价格,所属分类等) 顺手写的,没有建立新项目,放我自己的项目的一个文件夹里了,有兴趣的朋友可以拉下来试试 https://gitee.co ...

  5. python爬虫案例-爬取当当网数据

    输入关键字,爬取当当网中商品的基本数据,代码如下: 1 # Author:K 2 import requests 3 from lxml import etree 4 from fake_userag ...

  6. python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍

    来啦,老弟 我们已经知道怎么使用 Requests 进行各种请求骚操作 也知道了对服务器返回的数据如何使用 正则表达式 来过滤我们想要的内容 ... 那么接下来 我们就使用 requests 和 re ...

  7. python爬虫之爬取百度网盘

    爬虫之爬取百度网盘(python) #coding: utf8 """ author:haoning create time: 2015-8-15 "" ...

  8. Scrapy爬虫之爬取当当网图书畅销榜

      本次将会使用Scrapy来爬取当当网的图书畅销榜,其网页截图如下:   我们的爬虫将会把每本书的排名,书名,作者,出版社,价格以及评论数爬取出来,并保存为csv格式的文件.项目的具体创建就不再多讲 ...

  9. 如何爬取当当网畅销书排行榜信息? requests + pyquery

    ''' 爬取当当网的五星图书排行榜的信息 ''' Max_Page = 3 # 爬取前三页的排行榜信息 import requests from pyquery import PyQuery as p ...

最新文章

  1. asp.net oracle参数传递,asp.net – Oracle参数问题中的链接数据库
  2. 网页中文乱码--UTF-8和GB2312互转
  3. 2021银行共探转型新动能:大行酝酿质变 小行跨越数字鸿沟
  4. hdu 1671 Phone List 字典树模板
  5. AcWing 874. 筛法求欧拉函数(欧拉函数)
  6. 奇怪的315:大家都知道,为什么要等晚会曝光,管理部门呢
  7. MNN(二):借助Opencv实现MNN推理
  8. docker阿里云加速器
  9. php redis 里面的hscan 第四个参数count很不靠谱
  10. 255%可用已接通电源_直流稳压电源五款电路图详解
  11. poj2187 旋转卡(qia)壳(ke)
  12. linux桌面鼠标可动 但点其他,电脑鼠标能动但点不了的两种解决方法
  13. 利用Python自动生成及发送Excel报表
  14. 解决PL2303TA不支援WINDOWS 11及后续版本的问题
  15. 怎样看待Android的发展前景?以及Android开发的职业规划
  16. js中的debugger调试
  17. 博创联动陶伟:农业机器人难做在哪儿?
  18. 一套适用于所有老板的营销方案,让他一个月就卖出3780箱红酒!
  19. Java实现将字符串进行Base64跟GZip结合解密 Java实现Base64 + GZIP解密处理并且输出明文字符
  20. AIX切换Shell

热门文章

  1. 最好的嵌入式开发板是哪个?
  2. 移植中文TTS(ekho)到ARM linux开发板
  3. 2020中国上市公司品牌价值榜20强发布
  4. linux上 用unzip命令解压带密码保护的 zip 文件报错 unsupported compression method 99
  5. 个性化推荐的工业级实现
  6. Windows文件夹文件目录自动生成器
  7. 团队协作的三个基本要素——分工 合作 监督
  8. partition X does not end on cylinder boundary
  9. 基于linux的web自动化(selenium+jenkins+linux+firefox)
  10. 美国在线黄页服务提供商YP控股拟竞购雅虎网络资产