来啦,老弟


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


我们已经知道怎么使用


​Requests​


进行各种请求骚操作


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


​正则表达式​


来过滤我们想要的内容


...


那么接下来


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


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


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


怎么能发现好书呢?


所以我们


爬取当当网的前 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> 标签中


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


那么我们等会就可以使用


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


来进行过滤我们要的信息


一顿分析完了之后


接下来撸代码了


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


主要思路


使用 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">¥(.*?)</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爬虫06 | 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍_java_05


没毛病


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



完成


项目跑起来




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



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


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


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



本篇完


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


需要的朋友


在公众号发送


500


即可获取


ok


咱们下回再见