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

打开这个书籍排行榜的地址

http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1

可以看到一下网页

 

每一页显示 20 本书

当我们点击下一页的时候

你可以发现地址变了

http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-2

也就是我们翻到第几页的时候

链接地址的最后一个参数会跟着变

那么我们等会在 python 中可以用一个变量

来实现获取不同页数的内容

可以看到

我们通过 GET 请求,获得的请求头

服务器返回的数据

我们要的就是前 500 本书的

排名

书名

图片地址

作者

推荐指数

五星评分次数

价格

通过源码我们可以看到

 

这些信息被放在了 <li> 标签中

主要思路

使用 page 变量来实现翻页

我们使用 requests 请求当当网

然后将返回的 HTML 进行正则解析

由于我们暂时还没学到数据库

所以解析完之后就把内容存到文件中

def main(page):
   url = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' + str(page)
   html = request_dandan(url)
   items = parse_result(html) # 解析过滤我们想要的信息
   
   for item in items:
       write_item_to_file(item)

首先需要请求当当网,使用requests模块中的get方法,发起get请求

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

这里可以得到服务器返回的响应内容也就是源代码,这里就需要对源代码进行解析

使用正则表达式获取我们想要的关键信息

获取到了之后我们封装一下数据

def parse_result(html):
   pattern = re.compile('<li>.*?list_num.*?(\d+).</div>.*?<img src="(.*?)".*?class="name".*?title="(.*?)">.*?class="star">.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">&yen;(.*?)</span>.*?</li>',re.S)
   items = re.findall(pattern,html)
   for item in items:
       yield {
           'range': item[0],
           'iamge': item[1],
           'title': item[2],
           'recommend': item[3],
           'author': item[4],
           'times': item[5],
           'price': item[6]
       }

如果大家学过BeautifulSoup,那么解析这段代码就很容易了

最后写到文件中

def write_item_to_file(item):
   print('开始写入数据 ====> ' + str(item))
   with open('book.txt', 'a', encoding='UTF-8') as f:
       f.write(json.dumps(item, ensure_ascii=False) + '\n')
       f.close()

整合如下:

import requests
import re
import json


def write_item_to_file(item):
   print('开始写入数据 ====> ' + str(item))
   with open('dangdang.txt', 'a', encoding='UTF-8') as f:
       f.write(json.dumps(item, ensure_ascii=False) + '\n')
       f.close()
   str_item = str(item)
  

def func2(page):
    url = 'http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-' + str(page)
    html = request_dandan(url)
    items = parse_result(html)
    for item in items:
        write_item_to_file(item)

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

def parse_result(html):
    pattern = re.compile('<li>.*?list_num.*?(\d+).</div>.*?<img src="(.*?)".*?class="name".*?title="(.*?)">.*?class="star">.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">&yen;(.*?)</span>.*?</li>',re.S)
    items = re.findall(pattern,html)
    print(items)
    return items


if __name__ == '__main__':
    for i in range(1, 26):
        func2(i)
    # text = "JGod is a handsome boy,but he is a ider"
    # print (re.findall('\w*o\w*', text))  # 查找有o的单词








 

 

 

 

 

非常全的模板,包含各个页面。 登录 - 当当网 登录帮助 Email地址或昵称 手机号码 账户名 密 码 忘记密码? 还不是当当网用户?快捷方便的免费注册,让你立刻尽享当当网提供的各项优惠及服务... .public_footer_box { CLEAR: both; MARGIN: 0px auto; FONT: 12px "宋体",Arial,Helvetica,sans-serif; WIDTH: 100% } .public_footer { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; MARGIN: 0px auto; OVERFLOW: hidden; WIDTH: 950px; COLOR: #666; PADDING-TOP: 32px } .public_footer A { FONT-SIZE: 12px; COLOR: #666! important; TEXT-DECORATION: none } .public_footer A:hover { COLOR: #f60! important; TEXT-DECORATION: underline } .public_footer .sep { PADDING-RIGHT: 18px; DISPLAY: inline-block; PADDING-LEFT: 18px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px } .public_footer .footer_copyright { PADDING-LEFT: 168px; MARGIN: 0px auto; WIDTH: 792px } .public_footer .footer_copyright SPAN { DISPLAY: inline; FLOAT: left } .public_footer .footer_copyright SPAN { PADDING-TOP: 10px } .public_footer .footer_copyright A { PADDING-RIGHT: 4px } .public_footer .footer_icon { MARGIN: 10px 0px 0px 335px; WIDTH: 300px; HEIGHT: 57px } .public_footer .validator { PADDING-RIGHT: 5px; DISPLAY: inline; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: 0px; WIDTH: 135px; PADDING-TOP: 0px; HEIGHT: 47px } .public_footer .knet { PADDING-RIGHT: 5px; DISPLAY: inline; PADDING-LEFT: 5px; FLOAT: left; PADDING-BOTTOM: 0px; WIDTH: 135px; PADDING-TOP: 0px; HEIGHT: 47px } Copyright (C) 当当网 2004-2011, All Rights Reserved|京ICP证041189号音像制品经营许可证 京音网8号 function CNNIC_change(eleId) { var str= document.getElementById(eleId).href; var str1 =str.substring(0,(str.length-6)); str1+=CNNIC_RndNum(6); document.getElementById(eleId).href=str1; } function CNNIC_RndNum(k) { var rnd=""; for (var i=0;i < k;i++) rnd+=Math.floor(Math.random()*10); return rnd; } if($F('txtUsername')!="Email地址或昵称"){$('txtUsername').focus();$('txtPassword').focus();} echo_error_message(0);change_login_type(0,0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值