python爬取豆瓣高分书籍信息(request+xpath)
复习了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)相关推荐
- Python爬取豆瓣高分图书TOP100存入Excel
作为一名转行过来的新手小白,花了两周业余时间,在B站上把北京理工大学嵩天老师的"Python语言程序设计"和"Python网络爬虫与信息提取"看了一遍,心里跃跃 ...
- 爬虫实战-爬取豆瓣读书书籍信息
1. 豆瓣读书书籍种类列表 在下面这个URL, 我们可以获得所有的种类链接 https://book.douban.com/tag/ 如下图: 可以通过bs4和re库进行筛选, 得到所有图书种类, 结 ...
- python爬取豆瓣短评_Python爬取豆瓣指定书籍的短评
Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...
- python爬取豆瓣书籍_python 爬取豆瓣书籍信息
继爬取 猫眼电影TOP100榜单 之后,再来爬一下豆瓣的书籍信息(主要是书的信息,评分及占比,评论并未爬取).原创,转载请联系我. 需求:爬取豆瓣某类型标签下的所有书籍的详细信息及评分 语言:pyth ...
- python 爬取豆瓣书籍信息
继爬取 猫眼电影TOP100榜单 之后,再来爬一下豆瓣的书籍信息(主要是书的信息,评分及占比,评论并未爬取).原创,转载请联系我. 需求:爬取豆瓣某类型标签下的所有书籍的详细信息及评分 语言:pyth ...
- Python爬虫入门 | 4 爬取豆瓣TOP250图书信息
先来看看页面长啥样的:https://book.douban.com/top250 我们将要爬取哪些信息:书名.链接.评分.一句话评价-- 1. 爬取单个信息 我们先来尝试爬取书名,利用之 ...
- python BeautifulSoup爬取豆瓣电影top250信息并写入Excel表格
豆瓣是一个社区网站,创立于2005年3月6日.该网站以书影音起家,提供关于书籍,电影,音乐等作品信息,其描述和评论都是由用户提供的,是Web2.0网站中具有特色的一个网站. 豆瓣电影top250网址: ...
- Python爬取豆瓣Top250电影中2000年后上映的影片信息
Python爬取豆瓣Top250电影中2000年后上映的影片信息 前言 双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310.双十一当天打开看了下399,还得去抢满300减10 ...
- [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息
这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...
最新文章
- 麦当劳员工称缺乏归属感 长期重复劳动像个机器
- Linux 远程桌面 rdesktop 软件
- UVa 11475 - Extend to Palindrome
- java实现把数据写入到Excel并下载
- hadoop day 6
- H5 Canvas maximum-scale图像模糊解决办法
- 有时,你离成功的 exploit 只差一个信息泄漏:通过 ID tag 找到它
- 第7月第25天 xcode bundle calayer动画
- 樱桃OTC前工程师感恩自白
- ArcGIS Pro创建企业级地理数据库(Postgis)
- Windows注册表基础知识
- 《一个报文的路由器之旅》学习
- 【疑难解决】通过网页访问EasyDSS报错出现“无法访问此网站”提示的排查过程
- 漫谈程序员系列:你的幸运女神呢
- 高中OJ3837. 【NOIP2014模拟9.14】心灵终结
- java.lang.IllegalAccessException 没有访问权限
- 能给我讲解一下高通C2D的知识吗
- oracle命名规则
- flash幻灯片动画模板
- 80老翁谈人生(202):王选成就的历史还原
热门文章
- 代码分析之numpy.array
- ESP8266-Arduino编程实例-MLX90393磁场传感器驱动
- Intranet/Internet
- 【计网】DNS解析 DDNS解决动态公网IP访问
- Reference Counted Smart Pointers
- CenterNet:Objects as Points代码解析(九):通过高斯函数画热点图
- 消息中间件 - ActiveMQ高级特性和用法-Mirrored Queue 镜像队列(了解即可)(十)
- 二维占用栅格地图Occupancy grid maps
- JVM 垃圾回收概述
- 博客系统-写文章之富文本编辑器editor