复习了xpath,感觉还是熟悉的感觉。上次爬了微博爬了贴吧,这次就用xpath爬个豆瓣图书数据,作为学习时间序列的数据吧!

面向对象编程爬取

1.把自己要做的事情分类

 #获取url的规律组成url_list#遍历,获取请求,获得响应#爬取数据#保存数据

2.导包,初始化类

import requests
from lxml import etree
import csvclass doubanspider:def __init__(self):#豆瓣网站的urlself.url_temp="https://www.douban.com/doulist/45097500/?start={}"#本机的headersself.headers={"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"}

3.找到翻页时url的规律

发现每次翻页start加25

#构造循环每次加25
def get_urllist(self):return [self.url_temp.format(i*25) for i in range(1,9)]

4.建立爬虫与url的连接,获取响应

#模板 复用率很高
def parse_url(self,url):print(url)response=requests.get(url,headers=self.headers)return response.content.decode()

5.爬取数据

这里最恶心的地方是爬取的书名竟然是list类型,我写进文件要str类型,真尴尬

def get_content(self,html_url):#获取网站的html字符html=etree.HTML(html_url)
#Xpath选中要爬取的数据(这里我将他分组了,因为每次写"//div[@class='article']/div[@class='doulist-item']"这么一大串我烦)        div_list=html.xpath("//div[@class='article']/div[@class='doulist-item']")content_list=[]for div in div_list:#建立一个字典itemitem={}#获取书名(这里很坑啊,获取的书名竟然是个数组类型,我要把它转成str类型,要不然写不进文件)item["name"]=div.xpath(".//div[@class='title']/a/text()")item["name"] =[i.replace("\n",'') for i in item["name"]]item["name"]=''.join(item["name"])#获取作者item["author"] = div.xpath(".//div[@class='abstract']/text()")item["author"] = item["author"][0] if len(item["author"]) > 0 else None#获取出版社item["publish"] = div.xpath(".//div[@class='abstract']/text()")item["publish"]=item["publish"][1] if len(item["publish"])>0 else None#获取评分item["scores"] = div.xpath(".//div[@class='rating']/span[@class='rating_nums']/text()")#字典加到数组中content_list.append(item)return content_list
到这为止,看看爬取的数据长啥样

5.接着就是保存数据了

这里太恶心了,我找了很久什么能够将字典类型dict的数据转换成csv类型,我都想把我爬取数据的部分都改了,但最后还是找到了csv.DictWriter 这个太重要了

#把爬取的数据存储在本地douban.csv文件中,
def save_file(self,content_list):with open("douban.csv", 'w', encoding="UTF-8") as f:writer = csv.DictWriter(f, fieldnames=['name', 'author', 'publish','scores'])writer.writeheader()#遍历list.将里面的字典写在文件中for i in content_list:print("正在写入:" +i['name'])writer.writerow(i)

看看效果:

终于成功了!附上全部代码!

import requests
from lxml import etree
import csvclass doubanspider:def __init__(self):self.url_temp="https://www.douban.com/doulist/45097500/?start={}"self.headers={"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"}def get_urllist(self):return [self.url_temp.format(i*25) for i in range(1,9)]def parse_url(self,url):print(url)response=requests.get(url,headers=self.headers)return response.content.decode()def get_content(self,html_url):html=etree.HTML(html_url)div_list=html.xpath("//div[@class='article']/div[@class='doulist-item']")content_list=[]for div in div_list:item={}item["name"]=div.xpath(".//div[@class='title']/a/text()")item["name"] =[i.replace("\n",'') for i in item["name"]]item["name"]=''.join(item["name"])item["author"] = div.xpath(".//div[@class='abstract']/text()")item["author"] = item["author"][0] if len(item["author"]) > 0 else Noneitem["publish"] = div.xpath(".//div[@class='abstract']/text()")item["publish"]=item["publish"][1] if len(item["publish"])>0 else None# item["year"] = div.xpath(".//div[@class='abstract']/text()")# item["year"] = item["year"][2] if len(item["year"]) > 0 else None# item["year"] = div.xpath(".//div[@class='abstract']/text()")[2]item["scores"] = div.xpath(".//div[@class='rating']/span[@class='rating_nums']/text()")content_list.append(item)return content_listdef save_file(self,content_list):with open("douban.csv", 'w', encoding="UTF-8") as f:writer = csv.DictWriter(f, fieldnames=['name', 'author', 'publish','scores'])writer.writeheader()for i in content_list:print("正在写入:" +i['name'])writer.writerow(i)def run(self):#实现主要逻辑#获取url_listurl_list=self.get_urllist()#遍历,获取请求,获得响应for url in url_list:html_url=self.parse_url(url)#爬取数据contentlist=self.get_content(html_url)#保存数据self.save_file(contentlist)
#程序入口
if __name__ == "__main__":douban=doubanspider()douban.run()

看看爬取的数据文件

总结:还比较有趣的,以后还是多学学框架吧! 这段代码复用率会很高,爬招聘网站,电影等改改就能用!

python爬取豆瓣高分书籍信息(request+xpath)相关推荐

  1. Python爬取豆瓣高分图书TOP100存入Excel

    作为一名转行过来的新手小白,花了两周业余时间,在B站上把北京理工大学嵩天老师的"Python语言程序设计"和"Python网络爬虫与信息提取"看了一遍,心里跃跃 ...

  2. 爬虫实战-爬取豆瓣读书书籍信息

    1. 豆瓣读书书籍种类列表 在下面这个URL, 我们可以获得所有的种类链接 https://book.douban.com/tag/ 如下图: 可以通过bs4和re库进行筛选, 得到所有图书种类, 结 ...

  3. python爬取豆瓣短评_Python爬取豆瓣指定书籍的短评

    Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...

  4. python爬取豆瓣书籍_python 爬取豆瓣书籍信息

    继爬取 猫眼电影TOP100榜单 之后,再来爬一下豆瓣的书籍信息(主要是书的信息,评分及占比,评论并未爬取).原创,转载请联系我. 需求:爬取豆瓣某类型标签下的所有书籍的详细信息及评分 语言:pyth ...

  5. python 爬取豆瓣书籍信息

    继爬取 猫眼电影TOP100榜单 之后,再来爬一下豆瓣的书籍信息(主要是书的信息,评分及占比,评论并未爬取).原创,转载请联系我. 需求:爬取豆瓣某类型标签下的所有书籍的详细信息及评分 语言:pyth ...

  6. Python爬虫入门 | 4 爬取豆瓣TOP250图书信息

      先来看看页面长啥样的:https://book.douban.com/top250   我们将要爬取哪些信息:书名.链接.评分.一句话评价--   1. 爬取单个信息 我们先来尝试爬取书名,利用之 ...

  7. python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格

    豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...

  8. Python爬取豆瓣Top250电影中2000年后上映的影片信息

    Python爬取豆瓣Top250电影中2000年后上映的影片信息 前言 双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310.双十一当天打开看了下399,还得去抢满300减10 ...

  9. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...

最新文章

  1. 麦当劳员工称缺乏归属感 长期重复劳动像个机器
  2. Linux 远程桌面 rdesktop 软件
  3. UVa 11475 - Extend to Palindrome
  4. java实现把数据写入到Excel并下载
  5. hadoop day 6
  6. H5 Canvas maximum-scale图像模糊解决办法
  7. 有时,你离成功的 exploit 只差一个信息泄漏:通过 ID tag 找到它
  8. 第7月第25天 xcode bundle calayer动画
  9. 樱桃OTC前工程师感恩自白
  10. ArcGIS Pro创建企业级地理数据库(Postgis)
  11. Windows注册表基础知识
  12. 《一个报文的路由器之旅》学习
  13. 【疑难解决】通过网页访问EasyDSS报错出现“无法访问此网站”提示的排查过程
  14. 漫谈程序员系列:你的幸运女神呢
  15. 高中OJ3837. 【NOIP2014模拟9.14】心灵终结
  16. java.lang.IllegalAccessException 没有访问权限
  17. 能给我讲解一下高通C2D的知识吗
  18. oracle命名规则
  19. flash幻灯片动画模板
  20. 80老翁谈人生(202):王选成就的历史还原

热门文章

  1. 代码分析之numpy.array
  2. ESP8266-Arduino编程实例-MLX90393磁场传感器驱动
  3. Intranet/Internet
  4. 【计网】DNS解析 DDNS解决动态公网IP访问
  5. Reference Counted Smart Pointers
  6. CenterNet:Objects as Points代码解析(九):通过高斯函数画热点图
  7. 消息中间件 - ActiveMQ高级特性和用法-Mirrored Queue 镜像队列(了解即可)(十)
  8. 二维占用栅格地图Occupancy grid maps
  9. JVM 垃圾回收概述
  10. 博客系统-写文章之富文本编辑器editor