Top500的书籍

注:此方法用到了当当网站进行学习,不将数据用于其他用途,仅用于学习

**使用工具:**python中的re、json、requests

准备工作:

url变化规律:

表示第一页:

复制代码
http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-1

表示第二页的url:

我们可以得出http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1- +num 其中num表示具体的页数

re正则表达式需要筛选的信息特征

确定筛选信息的主体部分

复制代码
<li>
    <div class="list_num red">1.</div>   
    <div class="pic"><a href="http://product.dangdang.com/27911444.html" target="_blank"><img src="http://img3m4.ddimg.cn/77/13/27911444-1_l_11.jpg" alt="高尔基成长三部曲(童年、在人间、我的大学)"  title="高尔基成长三部曲(童年、在人间、我的大学)"/></a></div>    
    <div class="name"><a href="http://product.dangdang.com/27911444.html" target="_blank" title="高尔基成长三部曲(童年、在人间、我的大学)">高尔基成长三部曲(童年、在人间、我的大学)</a></div>    
    <div class="star"><span class="level"><span style="width: 94.2%;"></span></span><a href="http://product.dangdang.com/27911444.html?point=comment_point" target="_blank">151799条评论</a><span class="tuijian">100%推荐</span></div>    
    <div class="publisher_info">[苏]<a href="http://search.dangdang.com/?key=高尔基" title="[苏]高尔基 著,桑卓 译,酷威文化 出品" target="_blank">高尔基</a> 著,<a href="http://search.dangdang.com/?key=桑卓" title="[苏]高尔基 著,桑卓 译,酷威文化 出品" target="_blank">桑卓</a> 译,<a href="http://search.dangdang.com/?key=酷威文化" title="[苏]高尔基 著,桑卓 译,酷威文化 出品" target="_blank">酷威文化</a> 出品</div>    
    <div class="publisher_info"><span>2019-08-01</span>&nbsp;<a href="http://search.dangdang.com/?key=四川文艺出版社" target="_blank">四川文艺出版社</a></div>    

            <div class="biaosheng">五星评分:<span>109028次</span></div>
                      
    
    <div class="price">        
        <p><span class="price_n">&yen;54.00</span>
                        <span class="price_r">&yen;108.00</span>(<span class="price_s">5.0折</span>)
                    </p>
                    <p class="price_e">电子书:<span class="price_n">&yen;9.99</span></p>
                <div class="buy_button">
                          <a ddname="加入购物车" name="" href="javascript:AddToShoppingCart('27911444');" class="listbtn_buy">加入购物车</a>
                        
                        <a name="" href="http://product.dangdang.com/1901178320.html" class="listbtn_buydz" target="_blank">购买电子书</a>
                        <a ddname="加入收藏" id="addto_favorlist_27911444" name="" href="javascript:showMsgBox('addto_favorlist_27911444',encodeURIComponent('27911444&platform=3'), 'http://myhome.dangdang.com/addFavoritepop');" class="listbtn_collect">收藏</a>
     
        </div>

    </div>
  
    </li>  
查看hear部分,模拟浏览器:

其中,user-agent常用于模拟浏览器

代码:request:

复制代码
def request_dandan(url):
    try:
        res=requests.get(url)
        if res.status_code  ==  200:
            return res.text
    except requests.RequestException:
        return None

代码:re部分:

复制代码
def re_dandan(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],
            'time':item[5],
            'price':item[6]
        }

代码:存储信息部分:

复制代码
def write_item_to_file(item):
    with open('book.txt','a',encoding='UTF-8') as f:
        f.write(json.dumps(item, ensure_ascii=False)+'\n')
        f.close()

将这些代码拼装:

复制代码
import json
import re
import requests

#requests部分
def request_dandan(url):
    try:
        res=requests.get(url)
        if res.status_code  ==  200:
            return res.text
    except requests.RequestException:
        return None



def re_dandan(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],
            'time':item[5],
            'price':item[6]
        }
def write_item_to_file(item):
    with open('book.txt','a',encoding='UTF-8') as f:
        f.write(json.dumps(item, ensure_ascii=False)+'\n')
        f.close()

def main(i):
    url="http://bang.dangdang.com/books/fivestars/01.00.00.00.00.00-recent30-0-0-1-"+str(i)
    html=request_dandan(url)
    items=re_dandan(html)
    for item in items:
        write_item_to_file(item)

if __name__ == "__main__":
   for i in range(1,26):
       main(i)

最后,

正则表达式部分可能会出问题,正则表达式中pattern里的一个()表示一个被选择的部分,且在书写时我们常能看到.*? ,其中?表示非贪婪模式,本质上就是匹配的数据适可而止的意思。

相关推荐
一晌小贪欢6 小时前
Python爬虫第3课:BeautifulSoup解析HTML与数据提取
爬虫·python·网络爬虫·beautifulsoup·python爬虫·python3·requests
小白学大数据14 小时前
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
爬虫·python·ajax
Jonathan Star1 天前
跨域处理的核心是解决浏览器的“同源策略”限制,主流方案
javascript·chrome·爬虫
Amazon数据采集1 天前
深度解析:如何构建企业级电商数据采集架构?Pangolin API实战指南
爬虫·api
亿牛云爬虫专家2 天前
优化分布式采集的数据同步:一致性、去重与冲突解决的那些坑与招
分布式·爬虫·数据采集·爬虫代理·代理ip·数据同步·房地产
深蓝电商API3 天前
静态网页 vs 动态网页:爬虫该如何选择抓取策略?
爬虫
B站_计算机毕业设计之家3 天前
数据分析:Python懂车帝汽车数据分析可视化系统 爬虫(Django+Vue+销量分析 源码+文档)✅
大数据·爬虫·python·数据分析·汽车·可视化·懂车帝
孤狼warrior3 天前
爬虫+卷积神经网络项目实战解析——对图像狗的识别分类
人工智能·爬虫·神经网络·cnn·卷积神经网络
嫂子的姐夫4 天前
11-py调用js
javascript·爬虫·python·网络爬虫·爬山算法
kunge1v54 天前
学习爬虫第五天:自动化爬虫
爬虫·python·自动化