python爬取豆瓣书籍_Python爬虫-爬取豆瓣图书Top250

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

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

一、准备工作

需要安装requests、lxml、csv库

二、分析页面源码

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

1008644-20190513122317559-2097320512.png

以书名“追风筝的人” 获取书名的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]

初步代码

importrequestsfrom lxml importetree

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)

执行显示:

1008644-20190513133248451-2050744611.png

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

1008644-20190513133742977-886823985.png

得到xpath:

importrequestsfrom lxml importetree

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)

执行显示:

1008644-20190513134358151-389169457.png

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

importrequestsfrom lxml importetree

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 innames:print(name.strip())

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

1008644-20190513134911655-10751267.png

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

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

importrequestsfrom lxml importetree

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 intrs:

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)

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

1008644-20190513140200151-341500002.png

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

三、获取全部链接地址

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

1008644-20190513140512032-693557039.png

以代码实现

for i in range(10):

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

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

1008644-20190513140850959-573388331.png

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

完整代码

#-*- coding:utf-8 -*-

"""-------------------------------------------------

File Name: DoubanBookTop250

Author : zww

Date: 2019/5/13

Change Activity:2019/5/13

-------------------------------------------------"""

importrequestsfrom lxml importetree#获取每页地址

defgetUrl():for i in range(10):

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

urlData(url)#获取每页数据

defurlData(url):

html=requests.get(url).text

res=etree.HTML(html)trs= res.xpath('//*[@id="content"]/div/div[1]/div/table/tr')for tr intrs:

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条图书信息,一条不少,由于数据太多,只展示前部分

1008644-20190513141701693-1011645654.png

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

defwrite_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

-------------------------------------------------"""

importcsvimportrequestsfrom lxml importetree#获取每页地址

defgetUrl():for i in range(10):

url= 'https://book.douban.com/top250?start={}'.format(i*25)for item inurlData(url):

write_to_file(item)print('成功保存豆瓣图书Top250第{}页的数据!'.format(i+1))#数据存储到csv

defwrite_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)#获取每页数据

defurlData(url):

html=requests.get(url).text

res=etree.HTML(html)

trs= res.xpath('//*[@id="content"]/div/div[1]/div/table/tr')for tr intrs: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()

内容过多,只展示前部分

1008644-20190525091943156-644255135.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值