爬取当当网 Top 500 本五星好评书籍

一、分析页面确定需要获取的信息

  1. 页面通过控制 URL 的最后一个参数,实现分页
    在这里插入图片描述
    在这里插入图片描述
  2. 确定我们想要获取的信息:排名、书名、图片地址、作者、推荐指数、五星评分次数、价格
    通过审查元素,确定怎么得到这些信息(正则)
    在这里插入图片描述
    3.确定思路
    使用 page 变量实现分页,使用request 请求当当网,对返回的 HTML 进行正则解析,解析之后的内容存到文件中

二、实现爬取代码

  1. 爬取网页
def request_dangdang(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
    except requests.RequestException:
        return None
  1. 解析爬取的网页,获得需要的内容
def parse_result(html):
    boards = []
    tree = etree.HTML(html)
    rows = tree.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
    for row in rows:
        board = {}
        columns = row.xpath('div')
        board['range'] = columns[0].text
        board['title'] = columns[2].xpath('a')[0].text
        board['recommend'] = columns[3].xpath('//span[@class="tuijian"]')[0].text
        board['author'] = columns[4].xpath('a')[0].text
        board['times'] = columns[6].xpath('span')[0].text
        board['price'] = columns[7].xpath('//span[@class="price_n"]')[0].text
        boards.append(board)
    return boards

这里利用生成器也是得到一个迭代也是不错的方法

def parse_result(html):
    boards = []
    tree = etree.HTML(html)
    rows = tree.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
    for row in rows:
        columns = row.xpath('div')
        yield {
            'range': columns[0].text,
            'title': columns[2].xpath('a')[0].text,
            'recommend': columns[3].xpath('//span[@class="tuijian"]')[0].text,
            'author': columns[4].xpath('a')[0].text,
            'times': columns[6].xpath('span')[0].text,
            'price': columns[7].xpath('//span[@class="price_n"]')[0].text
        }

对于关键信息的筛选需要借助浏览器审查元素,具体分析
在这里插入图片描述
3. 写入文件

def write_file(board):
    print('开始写入数据 ==>' + str(board))
    with open('book.txt','a',encoding='utf-8') as f:
    	#ensure_ascii=False参数设置为 FALSE,否则存储乱码
        f.write(json.dumps(board,ensure_ascii=False) + '\n')
  1. main 函数实现 分页读取,控制存储
def main(page):
    url = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' + str(page)
    html = request_dangdang(url)
    boards = parse_result(html)
    for board in boards:
        write_file(board)
  1. 完整代码
import requests
import re
from lxml import etree
import json

def request_dangdang(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
    except requests.RequestException:
        return None

def parse_result(html):
    boards = []
    tree = etree.HTML(html)
    rows = tree.xpath("//ul[@class='bang_list clearfix bang_list_mode']/li")
    for row in rows:
    #     board = {}
        columns = row.xpath('div')
    #     board['range'] = columns[0].text
    #     board['title'] = columns[2].xpath('a')[0].text
    #     board['recommend'] = columns[3].xpath('//span[@class="tuijian"]')[0].text
    #     board['author'] = columns[4].xpath('a')[0].text
    #     board['times'] = columns[6].xpath('span')[0].text
    #     board['price'] = columns[7].xpath('//span[@class="price_n"]')[0].text
    #     boards.append(board)
    # return boards
    # for item in items:
        yield {
            'range': columns[0].text,
            'title': columns[2].xpath('a')[0].text,
            'recommend': columns[3].xpath('//span[@class="tuijian"]')[0].text,
            'author': columns[4].xpath('a')[0].text,
            'times': columns[6].xpath('span')[0].text,
            'price': columns[7].xpath('//span[@class="price_n"]')[0].text
        }

def write_file(board):
    print('开始写入数据 ==>' + str(board))
    with open('book.txt','w',encoding='utf-8') as f:
        f.write(json.dumps(board) + '\n')

def main(page):
    url = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' + str(page)
    html = request_dangdang(url)
    boards = parse_result(html)
    for board in boards:
        write_file(board)

if __name__ == '__main__':
    for i in range(1,26):
        main(i)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值