豆瓣网站很人性化,对于新手爬虫比较友好,没有如果调低爬取频率,不用担心会被封 IP。但也不要太频繁爬取。

涉及知识点:requests、html、xpath、csv

一、准备工作

需要安装requests、lxml、csv库

爬取目标:https://book.douban.com/top250

二、分析页面源码

打开网址,按下F12,然后查找书名,右键弹出菜单栏 Copy==> Copy Xpath

以书名“追风筝的人” 获取书名的xpath是://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div[1]/a

这里需要注意一下,浏览器复制的xpath只能作参考,因为浏览器经常会在自己里面增加多余的tbody标签,我们需要手动把这个标签删除,整理成//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a

同样获取图书的评分、评论人数、简介,结果如下:

//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]

//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[3]

//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/p[1]

初步代码

import requests
from lxml import etree html = requests.get('https://book.douban.com/top250').text
res = etree.HTML(html)
#因为要获取标题文本,所以xpath表达式要追加/text(),res.xpath返回的是一个列表,且列表中只有一个元素所以追加一个[0]
name = res.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a/text()')[0].strip()
score = res.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[2]/text()')[0].strip()
comment = res.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[2]/span[3]/text()')[0].strip()
info = res.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/p[1]/text()')[0].strip()
print(name,score,comment,info)

执行显示:

这里只是获取第一条图书的信息,获取第二、第三看看

得到xpath:

import requests
from lxml import etree html = requests.get('https://book.douban.com/top250').text
res = etree.HTML(html)
name1 = res.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div[1]/a/text()')[0].strip()
name2 = res.xpath('//*[@id="content"]/div/div[1]/div/table[2]/tr/td[2]/div[1]/a/text()')[0].strip()
name3 = res.xpath('//*[@id="content"]/div/div[1]/div/table[3]/tr/td[2]/div[1]/a/text()')[0].strip()
print(name1,name2,name3)

执行显示:

对比他们的xpath,发现只有table序号不一样,我们可以就去掉序号,得到全部关于书名的xpath信息:

import requests
from lxml import etree html = requests.get('https://book.douban.com/top250').text
res = etree.HTML(html)
names = res.xpath('//*[@id="content"]/div/div[1]/div/table/tr/td[2]/div[1]/a/text()')
for name in names:
print(name.strip())

执行结果:太多,这里只展示一部分

对于其他评分、评论人数、简介也同样使用此方法来获取。

到此,根据分析到的信息进行规律对比,写出获取第一页图书信息的代码:

import requests
from lxml import etree html = requests.get('https://book.douban.com/top250').text
res = etree.HTML(html)
trs = res.xpath('//*[@id="content"]/div/div[1]/div/table/tr')
for tr in trs:
name = tr.xpath('./td[2]/div[1]/a/text()')[0].strip()
score = tr.xpath('./td[2]/div[2]/span[2]/text()')[0].strip()
comment = tr.xpath('./td[2]/div[2]/span[3]/text()')[0].strip()
info = tr.xpath('./td[2]/p[1]/text()')[0].strip()
print(name,score,comment,info)

执行结果展示(内容较多,只展示前部分)

以上只是获取第一页的数据,接下来,我们获取到全部页数的链接,然后进行循环即可

三、获取全部链接地址

查看分析页数对应网页源码:

以代码实现

for i in range(10):
url = 'https://book.douban.com/top250?start={}'.format(i * 25)
print(url)

执行结果:正是正确的结果

经过分析,已经获取到全部的页面链接和每一页的数据提取,最后把整体代码进行整理和优化。

完整代码

#-*- coding:utf-8 -*-
"""
-------------------------------------------------
File Name: DoubanBookTop250
Author : zww
Date: 2019/5/13
Change Activity:2019/5/13
-------------------------------------------------
"""
import requests
from lxml import etree #获取每页地址
def getUrl():
for i in range(10):
url = 'https://book.douban.com/top250?start={}'.format(i*25)
urlData(url)
#获取每页数据
def urlData(url):
html = requests.get(url).text
res = etree.HTML(html)
trs = res.xpath('//*[@id="content"]/div/div[1]/div/table/tr')
for tr in trs:
name = tr.xpath('./td[2]/div/a/text()')[0].strip()
score = tr.xpath('./td[2]/div/span[2]/text()')[0].strip()
comment = tr.xpath('./td[2]/div/span[3]/text()')[0].replace('(','').replace(')','').strip()
info = tr.xpath('./td[2]/p[1]/text()')[0].strip()
print("《{}》--{}分--{}--{}".format(name,score,comment,info)) if __name__ == '__main__':
getUrl()

执行结果:总共250条图书信息,一条不少,由于数据太多,只展示前部分

把爬取到的数据存储到csv文件中

def write_to_file(content):
#‘a’追加模式,‘utf_8_sig’格式到处csv不乱码
with open('DoubanBookTop250.csv','a',encoding='utf_8_sig',newline='') as f:
fieldnames = ['name','score','comment','info']
#利用csv包的DictWriter函数将字典格式数据存储到csv文件中
w = csv.DictWriter(f,fieldnames=fieldnames)
w.writerow(content)

完整代码

#-*- coding:utf-8 -*-
"""
-------------------------------------------------
File Name: DoubanBookTop250
Author : zww
Date: 2019/5/13
Change Activity:2019/5/13
-------------------------------------------------
"""
import csv
import requests
from lxml import etree #获取每页地址
def getUrl():
for i in range(10):
url = 'https://book.douban.com/top250?start={}'.format(i*25)
for item in urlData(url):
write_to_file(item)
print('成功保存豆瓣图书Top250第{}页的数据!'.format(i+1)) #数据存储到csv
def write_to_file(content):
#‘a’追加模式,‘utf_8_sig’格式到处csv不乱码
with open('DoubanBookTop250.csv','a',encoding='utf_8_sig',newline='') as f:
fieldnames = ['name','score','comment','info']
#利用csv包的DictWriter函数将字典格式数据存储到csv文件中
w = csv.DictWriter(f,fieldnames=fieldnames)
w.writerow(content) #获取每页数据
def urlData(url):
html = requests.get(url).text
res = etree.HTML(html)
trs = res.xpath('//*[@id="content"]/div/div[1]/div/table/tr')
for tr in trs:
yield {
'name':tr.xpath('./td[2]/div/a/text()')[0].strip(),
'score':tr.xpath('./td[2]/div/span[2]/text()')[0].strip(),
'comment':tr.xpath('./td[2]/div/span[3]/text()')[0].replace('(','').replace(')','').strip(),
'info':tr.xpath('./td[2]/p[1]/text()')[0].strip()
}
#print("《{}》--{}分--{}--{}".format(name,score,comment,info)) if __name__ == '__main__':
getUrl()

内容过多,只展示前部分

Python爬虫-爬取豆瓣图书Top250的更多相关文章

  1. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

  2. Python爬虫-爬取豆瓣电影Top250

    #!usr/bin/env python3 # -*- coding:utf-8-*- import requests from bs4 import BeautifulSoup import re ...

  3. Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

    大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(st ...

  4. python爬虫 Scrapy2-- 爬取豆瓣电影TOP250

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  5. Python爬虫----抓取豆瓣电影Top250

    有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息. 1.观察url 首先观察一下网址的结构 http://movie.douban.com/to ...

  6. Python爬虫爬取豆瓣电影之数据提取值xpath和lxml模块

    工具:Python 3.6.5.PyCharm开发工具.Windows 10 操作系统.谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title.链接地址.图片.评价人数.评分等 网址:https:// ...

  7. Python项目之我的第一个爬虫----爬取豆瓣图书网,统计图书数量

    今天,花了一个晚上的时间边学边做,搞出了我的第一个爬虫.学习Python有两个月了,期间断断续续,但是始终放弃,今天搞了一个小项目,有种丰收的喜悦.废话不说了,直接附上我的全部代码. # -*- co ...

  8. 2019-02-01 Python爬虫爬取豆瓣Top250

    这几天学了一点爬虫后写了个爬取电影top250的代码,分别用requests库和urllib库,想看看自己能不能搞出个啥东西,虽然很简单但还是小开心. import requests import r ...

  9. python3 爬虫---爬取豆瓣电影TOP250

    第一次爬取的网站就是豆瓣电影 Top 250,网址是:https://movie.douban.com/top250?start=0&filter= 分析网址'?'符号后的参数,第一个参数's ...

随机推荐

  1. web大文件分块上传断点续传demo

    一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...

  2. cube.js 学习(一)简单项目创建

    cube.js 是一个很不错的模块化分析框架,基于schema生成sql 同时内置可代码生成,可以快速的搞定 web 分析应用的开发 安装cli 工具 npm install -g cubejs-cl ...

  3. noi.ac #44 链表+树状数组+思维

    \(des\) 给出长度为 \(n\) 的序列,全局变量 \(t\),\(m\) 次询问,询问区间 \([l, r]\) 内出现次数为 \(t\) 的数的个数 \(sol\) 弱化问题:求区间 \([ ...

  4. 数据结构实验之排序三:bucket sort (SDUT 3400)

    桶排序: #include <stdio.h> #include <string.h> int a[5555555]; int main() { int n,m; scanf( ...

  5. 简要描述Python的垃圾回收机制(garbage collection)

    这里能说的很多.你应该提到下面几个主要的点: Python在内存中存储了每个对象的引用计数(reference count).如果计数值变成0,那么相应的对象就会小时,分配给该对象的内存就会释放出来用 ...

  6. 编译器错误 CS0540

    编译项目报错:包含类型不实现接口,CS0540 原因:试图在非派生自接口的类中实现接口成员. 解决方案: 删除接口成员的实现,或将接口添加到类的基类列表. 下面的两个示例生成 CS0540: 一. / ...

  7. 方法重载与invokevirtual字节码指令的关系

    1.方法重载 创建MyTest5类 public class MyTest5 { public void test(Grandpa grandpa){ System.out.println(" ...

  8. keepalived vip removed with dhcp renewal【原创】

    最近发现公司云平台服务器的vip有丢失的现象,查看keepalived日志 Jun :: lb1 dhclient: DHCPREQUEST of (xid=0x6deab016) Jun :: lb ...

  9. Tensorflow 2 Cifar10离线数据集手动下载、离线安装、本地加载、快速读取

    Tensorflow 2 Cifar10离线数据集手动下载.离线安装.本地加载.快速读取 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com   查 ...

  10. intel 性能分析

    分析memory bound,etc https://software.intel.com/en-us/articles/intel-vtune-amplifier-tutorials