赞
踩
开始系统学习爬虫,试着写写爬虫的流程
爬取的是手机版的豆瓣的电视剧信息
链接:
https://m.douban.com/tv/american
# 具体 url
https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?os=android&for_mobile=1&callback=jsonp2&start=0&count=18&loc_id=108288&_=0
# 测试去掉无用的参数,得到 url
https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?start=0&count=18&loc_id=108288
Referer:告诉服务器当前请求是从哪个链接请求过来的
User-Agent:作用是伪装成浏览器
发现页面时动态加载,为了方便取到所有的页数链接,可以根据链接中的关键字进行搜索,来进行链接过滤
并且发现每次请求的链接只有
start
参数的数值不一样,从 0 开始,每次加 18,应该是每页显示的数量,找到总数量就可以取到总页数来进行 url 拼接
发现总数量
total
就在返回的数据中
代码编写分为两个步骤:
第一步:先发送一次请求,取到总数量,
第二步:通过总数量取出有多少页,并拼接出一个 url 列表,遍历得到每个 url ,发送请求,取到数据,并保存
在 run 方法中只写流程,将具体实现分割成一个个的函数
创建一个类,在初始化方法中存入 url 和 headers
class Douban:
def __init__(self):
self.url_temp = "https://m.douban.com/rexxar/api/v2/subject_collection/filter_tv_american_hot/items?start={}&count=18&loc_id=108288"
self.headers = {
"Referer": "https://m.douban.com/tv/american",
"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3608.4 Mobile Safari/537.36"
}
发送请求,GET 请求 返回响应回来的 json 字符串
def parse_get_url(self, url):
resp = requests.get(url=url, headers=self.headers)
return resp.content.decode()
取到总页数 将上一步取到的 json 字符串使用
json.loads()
方法转换成 python 数据类型
def get_total(self, json_str):
ret_dict = json.loads(json_str)
return ret_dict['total']
保存总页数,保存第一页的数据
保存到文件的时候先转换成 python 数据类型,使用
json.dumps()
将数据存成 json 数据
json.dumps() 的两个参数:
ensure_ascii=False
: 实现让中文写入的时候保持为中文
indent=2
: 实现换行和空格
def get_data(self, json_str):
ret = json.loads(json_str)
return ret
def save_douban_data(self, ret, count):
print("正在保存第 {} 页".format(count))
with open('doubantv/tv_{}.txt'.format(count), 'w', encoding='utf-8') as f:
f.write(json.dumps(ret, ensure_ascii=False, indent=2))
根据 total 求出页数,拼接 url
def get_url(self, total):
# 总页数
total_page = total // 18 if total % 18 == 0 else total // 18 + 1
url_list = [self.url_temp.format(i * 18) for i in range(1, total_page)]
return url_list
遍历 url_list ,取到每个 url,调用前面的方法发起请求并保存数据
# 取出每个 url
for url in url_list:
# 获取每个响应数据
json_str = self.parse_get_url(url)
# 获取详情数据
ret = self.get_data(json_str)
# 保存数据
self.save_douban_data(ret, url_list.index(url) + 1)
数据爬取完毕,保存的比较粗糙,整体进行保存,没有进行过滤
完整代码已上传 GitHub
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。