用XPath和xlwings爬取豆瓣读书Top250时遇到的问题及解决办法

一. XPath解析网页,提取数据

  1. 有些书会有副标题,如《人类简史:从动物到上帝》,冒号及后面的文字跟主标题不在同一个xpath,需要另外提取。而有些书名没有副标题,如果也用提取副标题的xpath就会出错,所以要用 try…except… 来处理。
        name = p.xpath('./tr/td[2]/div[1]/a/text()')[0].strip()  #书名
        name = name.replace('\n', '').replace(' ', '')
        try:
            add = p.xpath('./tr/td[2]/div[1]/a/span/text()')[0]  #副标题
            name = name + add
        except:
            pass

二. xlwings存储数据

  1. 使用xlwings保存到xlsx文件中时,如果不想看见excel打开,可以在打开时设置visible= False.
app = xlwings.App(visible= False,add_book=False)
  1. 如果用wb = xlwings.Book()打开xlsx文件,最后不用quit()方法,只需wb.close()。
    如果用app的话,最后要app.quit()。
app = xw.App(visible= False,add_book=False)
wb = app.books.add()
'''
wb.save('file.xlsx')
wb.close()
app.quit()
  1. xlwings的save()方法是覆写的(如果是已存在的文件)。

三.完整代码

import requests
from lxml import etree
import xlwings as xw
import time
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
    'Host': 'book.douban.com'
}
books = []  #所有书及其信息都放进这个列表
for i in range (0,10):
    link = 'https://book.douban.com/top250?start=' +str(i*25)   #每页的地址
    res = requests.get(link, headers=headers, timeout=20)  #获取响应体
    print(str(i+1),'页响应状态码:',res.status_code)  #通过状态码判断响应状态,200表示响应成功
    html = etree.HTML(res.text)
    paths = html.xpath('//*[@id="content"]/div/div[1]/div/table')
    for p in paths:
        name = p.xpath('./tr/td[2]/div[1]/a/text()')[0].strip()  #书名
        name = name.replace('\n', '').replace(' ', '')
        try:
            add = p.xpath('./tr/td[2]/div[1]/a/span/text()')[0]  #副标题
            name = name + add
        except:
            pass  #如果没有副标题,就忽略弹出的异常
        info = p.xpath('./tr/td[2]/p[1]/text()')[0]  #书籍信息
        rating = p.xpath('./tr/td[2]/div[2]/span[2]/text()')[0]  #评分
        rating_people = p.xpath('./tr/td[2]/div[2]/span[3]/text()')[0].strip()  #评分人数
        rating_people = rating_people.replace('(', '').replace(')', '').replace('\n', '').replace(' ', '').replace('人评价', '')  #只留下数字
        quote = p.xpath('./tr/td[2]/p[2]/span/text()')[0]  #评语
        book_link = p.xpath('./tr/td[2]/div[1]/a/@href')[0]  #书籍链接
        books.append([name,info,rating,rating_people,quote,book_link])  #每本书都用放一个列表,再把所有书的列表放进一个列表,以便写入文件
    time.sleep(2)  #避免频繁请求而被封IP,豆瓣的话不要也行

print('Writing into file...')
app = xw.App(visible= False,add_book=False)
wb = app.books.add()
sht0 = wb.sheets[0]
sht0.range('A1').value = ['书名','作者/出版社/出版时间/定价','评分','评价人数','评语','网址']  #在第一行写入各个标题
sht0.range('A2').value = books  #从第二行开始多行写入(books是二位列表)
wb.save('books_by_xpath.xlsx')
wb.close()
app.quit()
print('Finish!')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值