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


来啦,老弟


python


我们已经知道怎么使用


Requests


进行各种请求骚操作


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


正则表达式


来过滤我们想要的内容



那么接下来


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


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


python


怎么能发现好书呢?


所以我们


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


怎么样?


python


ok


接下来就是


学习 python 的正确姿势


请在电脑的陪同下


边看本文边练习


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


先摸清对方的底


我们才能战无不胜


python


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


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


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


python


每一页显示 20 本书


当我们点击下一页的时候


你可以发现地址变了


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


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


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


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


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


python


接着


用我们之前说的 Chrome 骚操作


来分析一下


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


以及


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


python


可以看到


我们通过 GET 请求


python


我们的请求头


python


这是服务器返回来的数据


python


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


python



我们要的就是前 500 本书的


排名

书名

图片地址

作者

推荐指数

五星评分次数

价格


通过源码我们可以看到


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


python

python


那么我们等会就可以使用


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


来进行过滤我们要的信息


一顿分析完了之后


接下来撸代码了


python


主要思路


使用 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)


可以看到这样的数据


python


没毛病


现在我们获取的是第 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()



完成


项目跑起来


python


python


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



python


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


python



本篇完


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


需要的朋友


在公众号发送


500


即可获取


ok


咱们下回再见



python

扫一扫

学习 Python 没烦恼


python



近期文章


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


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


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








支持小帅b的就顺手

python点个好看吧

原文始发于微信公众号(学习python的正确姿势):python

发表回复