zoukankan      html  css  js  c++  java
  • python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍

     

    来啦,老弟

     

     

    我们已经知道怎么使用

     

    Requests

     

    进行各种请求骚操作

     

    也知道了对服务器返回的数据如何使用

     

    正则表达式

     

    来过滤我们想要的内容

     

    ...

     

    那么接下来

     

    我们就使用 requests 和 re 来写一个爬虫

     

    作为一个爱看书的你(说的跟真的似的)

     

     

    怎么能发现好书呢?

     

    所以我们

     

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

     

    怎么样?

     

     

    ok

     

    接下来就是

     

    学习 python 的正确姿势

     

    请在电脑的陪同下

     

    边看本文边练习

     

    首先我们要对我们的目标网站进行分析

     

    先摸清对方的底

     

    我们才能战无不胜

     

     

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

     

    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 中可以用一个变量

     

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

     

     

    接着

     

    用我们之前说的 Chrome 骚操作

     

    来分析一下

     

    我们要的内容是怎么请求的

     

    以及

     

    返回给我们的源代码是什么样的

     

     

    可以看到

     

    我们通过 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)

     

    请求当当网

     

    当我们请求成功之后

     

    拿到源代码

     

    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><spansclass="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]
           }

     

     

    打印一下看看结果

     

    for item in items:
           print(item)

     

    可以看到这样的数据

     

     

    没毛病

     

    现在我们获取的是第 1 页的数据

     

    如何自动获取 25 页 500 条数据呢

     

    来个 for 循环呗

     

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

     

     

    获取完 500 本书的数据之后

     

    存到 book.txt 文件

     

     

    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) + ' ')
           f.close()

     

     

    完成

     

    项目跑起来

     

     

     

    打开我们存储的 book.txt 看看

     

     

     

    前 500 本书的数据就被我们拿到啦

     

     

     

    本篇完

     

    完整代码小帅b已经放到公众号后台啦

     

    需要的朋友

     

    在公众号发送

     

    500

     

    即可获取

     

    ok

     

    咱们下回再见

     

     

    扫一扫

    学习 Python 没烦恼

     

     

     

    近期文章

     

    python爬虫03 | 那个叫做Urllib的库让我们的python假装是浏览器

     

    python爬虫04 | 长江后浪推前浪,Requests库把urllib库拍在沙滩上

     

    python爬虫05 | 年轻人,不会正则表达式你睡得着觉?有点出息没有?

     

     

     

     

     

     

     

    支持小帅b的就顺手

    点个好看吧

  • 相关阅读:
    解决centos7的root账户下无法通过code命令启动vscode
    centos7安装epel
    centos7用过yum安装vscode
    yum install gcc报错Error: Package: glibc-2.17-260.el7_6.6.i686 (updates) Requires: glibc-common = 2.17
    centos7通过yum从vim7升级到vim8
    解决VM虚拟机安装centos7无法联网
    centos7设置开机默认使用root账户登陆
    centos7使用sudo命令提示sudo command not found
    不同编译器下C++基本数据类型的字节长度
    C++函数模板
  • 原文地址:https://www.cnblogs.com/fxxkpython/p/10832023.html
Copyright © 2011-2022 走看看