python爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍

版权声明:版权所有:公众号:学习python的正确姿势 https://blog.csdn.net/weixin_42469142/article/details/89856325

 

来啦,老弟

 

640?wx_fmt.gif

 

我们已经知道怎么使用

 

Requests

 

进行各种请求骚操作

 

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

 

正则表达式

 

来过滤我们想要的内容

 

...

 

那么接下来

 

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

 

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

 

640?wx_fmt.jpeg

 

怎么能发现好书呢?

 

所以我们

 

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

 

怎么样?

 

640?wx_fmt.gif

 

ok

 

接下来就是

 

学习 python 的正确姿势

 

请在电脑的陪同下

 

边看本文边练习

 

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

 

先摸清对方的底

 

我们才能战无不胜

 

640?wx_fmt.jpeg

 

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

 

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

 

我们可以看到是这样的一个网页

 

640?wx_fmt.png

 

每一页显示 20 本书

 

当我们点击下一页的时候

 

你可以发现地址变了

 

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

 

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

 

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

 

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

 

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

 

640?wx_fmt.jpeg

 

接着

 

用我们之前说的 Chrome 骚操作

 

来分析一下

 

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

 

以及

 

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

 

640?wx_fmt.gif

 

可以看到

 

我们通过 GET 请求

 

640?wx_fmt.png

 

我们的请求头

 

640?wx_fmt.png

 

这是服务器返回来的数据

 

640?wx_fmt.png

 

接着我们再来分析一下我们要抓取的关键信息

 

640?wx_fmt.png

 

 

我们要的就是前 500 本书的

 

排名

书名

图片地址

作者

推荐指数

五星评分次数

价格

 

通过源码我们可以看到

 

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

 

640?wx_fmt.png

640?wx_fmt.png

 

那么我们等会就可以使用

 

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

 

来进行过滤我们要的信息

 

一顿分析完了之后

 

接下来撸代码了

 

640?wx_fmt.jpeg

 

主要思路

 

使用 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><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]
        }

 

 

打印一下看看结果

 

for item in items:
        print(item)

 

可以看到这样的数据

 

640?wx_fmt.png

 

没毛病

 

现在我们获取的是第 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) + '\n')
        f.close()

 

 

完成

 

项目跑起来

 

640?wx_fmt.gif

 

640?wx_fmt.gif

 

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

 

 

640?wx_fmt.png

 

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

 

640?wx_fmt.gif

 

 

本篇完

 

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

 

需要的朋友

 

在公众号发送

 

500

 

即可获取

 

ok

 

咱们下回再见

 

 

640?wx_fmt.gif

扫一扫

学习 Python 没烦恼

 

640

 

 

近期文章

 

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

 

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

 

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

 

 

 

 

 

 

 

支持小帅b的就顺手

640点个好看吧

猜你喜欢

转载自blog.csdn.net/weixin_42469142/article/details/89856325