实现过程
1. 接口
项目实现通过关键词查询来得到与用户相关的新闻,那么就要从搜索页的进行分析,查看url:
这里的接口是/query?data,这样可以对爬取的url进行设置:
# url
url = 'https://cn.nytimes.com/search/data'
# 参数
params = {
"query": query,
"lang": "",
"dt": "json",
"from": 0,
"size": 100,
}
其中query是查询的关键字,dt是dataType,设为 json,from是从从第几个文章开始,size是本次数据的个数。
2. requests模块代理
这里要注意纽约时报是外网,requests模块需要开代理并进行设置:
# 代理
proxies = {'http': 'http://127.0.0.1:7890', 'https': 'http://127.0.0.1:7890'}
res = requests.get(url, params=params, proxies=proxies);
这里的proxies可以从网络设置中的代理找到:
如果这里的代理设置出错或者没有设置,可能会出现proxies相关报错:
requests.exceptions.ProxyError: HTTPSConnectionPool(host='cn.nytimes.com', port=443): Max retries exceeded with url: /search/data?query=%E4%B8%80%E5%B8%A6%E4%B8%80%E8%B7%AF&lang=&dt=json&from=0&size=100 (Caused by ProxyError('Cannot connect to proxy.', OSError(0, 'Error')))
3. 连接mysql数据库
# 连接mysql数据库
db = pymysql.connect(host='localhost', user='root', password='123456', db='nytimes', port=3306)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
print("数据库连接成功")
4. 数据抓取
通过请求设定好的url得到数据,并将数据转化为utf8格式:
printTip("开始抓取相关文章")
while (True):
res = requests.get(url, params=params, proxies=proxies);
_from = _from + _size
params["from"] = _from;
data = res.text;
data = json.loads(data, encoding="utf8");
接下来进行数据的分析,将对应的数据提取出来:
# 分析数据
id = data['items'][i].get('id')
type = data['items'][i].get('type')
score = data['items'][i].get('score')
headline = data['items'][i].get('headline')
date = data['items'][i].get('publication_date')
web_url = data['items'][i].get('web_url')
description = data['items'][i].get('description')
接下来将提取到的数据保存在数据库中:
# SQL 插入语句
sql = "INSERT INTO news(id, type, score, headline, date, url, description)VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')" % (
id, type, score, headline, date, web_url, description)
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
5.爬取结果
在终端通过搜索词启动爬虫程序:
开始爬虫:
news_crawler.py 为爬虫文件名, 奥运会为想要搜索的关键词。数据库结果:
id:文章的唯一标识
type:文章类型
score:文章的评分,用于给搜索结果进行排序,将相关或时效性好的文章排在上面。
headline:文章标题
url:文章的url连接
description:文章的摘要或简介