赞
踩
我们就使用 requests 和 re 来写一个爬虫
接下来就是 学习 python 的正确姿势:
1.请在电脑的陪同下
2.边看本文边练习
3.首先我们要对我们的目标网站进行分析
先摸清对方的底 我们才能战无不胜
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 中可以用一个变量
来实现获取不同页数的内容
也就是我们翻到第几页的时候
链接地址的最后一个参数会跟着变
那么我们等会在 python 中可以用一个变量
来实现获取不同页数的内容
可以看到
我们通过 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:
print(item) # 打印测试获取到的信息
# 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">.*?target="_blank">(.*?)</a>.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">¥(.*?)</span>.*?<span\sclass="price_r">¥(.*?)</span>.*?<span\sclass="price_s">(.*?)</span>.*?</li>',
re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'图书封面': item[1],
'图书名': item[2],
'图书评论数': item[3],
'五星评分': item[4],
'作者': item[5],
'出版社': item[6],
'五星评分次数': item[7],
'图书折后价': item[8],
'图书原价': item[9],
'折扣额度': item[10]
}
打印下看看结果
打开此处注释即可
没毛病
下面我们直接获取25页500条数据
编写for循环
# 自动获取25页500条数据
for i in range(1, 26):
main(i)
存储到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()
完成启动项目
整体代码如下
import json
import re
import requests
# 封装一个执行函数
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:
# print(item) # 打印测试获取到的信息
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 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()
def parse_result(html):
'''
:param html:
:return:
下标0:图书排名
下标1:图书封面
下标2:图书名
下标3:图书评论数
下标4:五星评分
下标5:作者名称
下标6:出版社
下标7:五星评分次数
下标8:图书折后价
下标9:图书原价 <span\sclass="price_r">¥(.*?)</span>.*?
下标10:折扣额度 <span\sclass="price_s">(.*?)</span>.*?
'''
pattern = re.compile(
'<li>.*?list_num.*?(\d+).</div>.*?<img src="(.*?)".*?class="name".*?title="(.*?)">.*?class="star">.*?target="_blank">(.*?)</a>.*?class="tuijian">(.*?)</span>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="publisher_info">.*?target="_blank">(.*?)</a>.*?class="biaosheng">.*?<span>(.*?)</span></div>.*?<p><span\sclass="price_n">¥(.*?)</span>.*?<span\sclass="price_r">¥(.*?)</span>.*?<span\sclass="price_s">(.*?)</span>.*?</li>',
re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'图书封面': item[1],
'图书名': item[2],
'图书评论数': item[3],
'五星评分': item[4],
'作者': item[5],
'出版社': item[6],
'五星评分次数': item[7],
'图书折后价': item[8],
'图书原价': item[9],
'折扣额度': item[10]
}
if __name__ == '__main__':
# 自动获取25页500条数据
for i in range(1, 26):
main(i)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。