增量爬取思路
1、将爬取过的地址存放到数据库中
2、程序爬取时先到数据库中查询比对,如果已经爬过则不会继续爬取
动态加载网站数据抓取
1、F12打开控制台,页面动作抓取网络数据包
2、抓取json文件URL地址
# 控制台中 XHR :异步加载的数据包
# XHR -> Query String Parameters(查询参数)
数据抓取最终梳理
# 响应内容中存在
1、确认抓取数据在响应内容中是否存在
2、分析页面结构,观察URL地址规律
1、大体查看响应内容结构,查看是否有更改 -- (百度视频案例)
2、查看页面跳转时URL地址变化,查看是否新跳转 -- (民政部案例)
3、开始码代码进行数据抓取
# 响应内容中不存在
1、确认抓取数据在响应内容中是否存在
2、F12抓包,开始刷新页面或执行某些行为,主要查看XHR异步加载数据包
1、GET请求: Request Headers、Query String Paramters
2、POST请求:Request Headers、FormData
3、观察查询参数或者Form表单数据规律,如果需要进行进一步抓包分析处理
1、比如有道翻译的 salt+sign,抓取并分析JS做进一步处理
2、此处注意请求头中的cookie和referer以及User-Agent
4、使用res.json()获取数据,利用列表或者字典的方法获取所需数据
动态加载网站抓取
1,右键—>查看网页源码,没有所抓取的数据
2,滚动鼠标滑轮,或者点击,或者其他动作,数据才会加载出来
3,局部网页刷新
豆瓣电影数据抓取案例
- 目标
1、地址: 豆瓣电影 - 排行榜 - 剧情
2、目标: 电影名称、电影评分
- F12抓包(XHR)
1、Request URL(基准URL地址) :https://movie.douban.com/j/chart/top_list?
2、Query String(查询参数)
# 抓取的查询参数如下:
type: 13 # 电影类型
interval_id: 100:90
action: ''
start: 0 # 每次加载电影的起始索引值 0 20 40 60
limit: 20 # 每次加载的电影数量
- 代码实现 - 全站抓取 - 完美接口 - 指定类型所有电影信息
import requests
import json
import re
from fake_useragent import UserAgent
class DouBan():
def __init__(self):
self.url = 'https://movie.douban.com/j/chart/top_list?'
self.i = 0
# 获取页面
def pare_html(self, params):
html = requests.get(url=self.url, params=params, headers={
'User-agent': UserAgent().random}).text
# json.loads():把json数据->python数据类型
html = json.loads(html)
# 提取数据
item = {
}
for film in html:
item['名字'] = film['title']
item['评分'] = film['score']
print(item)
self.i += 1
def run(self):
type_dict = self.get_all()
menu = ''
for key in type_dict.keys():
menu += ' {} '.format(key)
print(menu)
name = input("请输入电影类别:")
#得到了type的值
typ = type_dict[name]
total = self.get_tatal(typ)
#100个电影 range(0,100,20)
for page in range(0, total, 20):
params = {
"type": typ,
"interval_id": "100:90",
"action": "",
"start": str(page),
"limit": "20",
}
self.pare_html(params)
print("总数", self.i)
def get_all(self):
url = 'https://movie.douban.com/chart/'
html = requests.get(url=url, headers={
'User-Agent': UserAgent().random}).text
p = re.compile('<a href=".*?type_name=(.*?)&type=(.*?)&.*?</a>', re.S)
r_list = p.findall(html)
# [('剧情','5'),('喜剧','24')]
type_dict = {
}
for r in r_list:
type_dict[r[0]] = r[1]
return type_dict
# 获取总页数
def get_tatal(self,typ):
url =