需要将网络热门文章爬取入库
页面选择
通过这个页面 能找到接口
然后就需要对接口进行加工操作了
我用python3 的 requests方法请求不成功,就改成curl了。
import re import json import sys import time import pymysql import subprocess from pymysql.cursors import DictCursor from db import db_ini,xxxx global_id_list = [] # 全局 文章 id 列表 def shell_curl(command): res = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8', timeout=180, executable='/bin/bash') if res.returncode == 0: return(res.stdout) else: return(False) def custom_time(timestamp): # 转换成localtime time_local = time.localtime(timestamp) # 转换成新的时间格式(2016-05-05 20:28:54) dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local) return (dt) def to_db(data=None,sql=None,type_ini=None): conn = pymysql.connect(**xxxx("test")) conn.autocommit(True) cur = conn.cursor(DictCursor) resp = db_ini(cur=cur,data=data,sql=sql,type_ini=type_ini) cur.close() return(resp) def get_url(url,data): cmd = "curl " + url # linux curl 执行 命令 dv_count = [] # 文章初始数量 resp = shell_curl(cmd) # 返回 字符串 格式 json_data = json.loads(resp) try : list_data = json_data["data"]["list"] # 如果百度搜索没有结果 会返回空列表 就会报错 except: return(99) # 因为没有搜索结果 返回大于10的数字 模拟请求完成 for i in list_data: # 循环每个页面的内容 try: if i["source"] == "百度动态": # 百度动态 = 百家号 data["article_id"] = i["commentId"] try: # 获取标题 一般情况下是 \n\n 之前的是标题 title = re.search(r"(?P<title>.*?)\n\n",str(i["originContent"])).group("title") except: title = "" try: # 获取文章内容 一般情况下是 \n\n 之后的是标题 content = ''.join(re.findall(r"\n\n(?P<content>.*)",str(i["originContent"]))) except: content = str(i["originContent"]) if not content: # 如果 获取不到 那么内容就是空的 try: content = ''.join(re.findall(r"\n(?P<content>.*)",str(i["originContent"]))) if not content: content = str(i["originContent"]) except: content = str(i["originContent"]) data["title"] = title data["content"] = content data["publish_time"] = custom_time(int(i["pubUnixTime"])) data["content_url"] = json.dumps(i["originImgs"]) data["detail_source"] = i["nick"] data["from_url"] = i["url"] data["database"] = "****" data["table"] = "****" data["unique_keys"] = ["home_team","guest_team","article_id","from_type","dv_type"] if len(content) < 50: continue global global_id_list # 引入全局变量 if data["article_id"] in global_id_list: # 判断 文章 ID 是否存在全局 ID 列表 continue global_id_list.append(data["article_id"]) # 全局 ID 列表 + 1 dv_count.append(data["article_id"]) # 某个文章类型的统计 + 1 to_db(data=data,type_ini="inandto") if len(dv_count) >= 3: return(len(dv_count)) except: continue return(len(dv_count)) def main(a,b): dv_types = ["比分预测","首发阵容"] data = { "home_team":a, "guest_team":b, "from_type":2, } for i in dv_types: data["dv_type"] = i pn = 0 # 翻页统计 dv_count = 0 # 文章数量统计 while dv_count < 3: if pn > 30 :break url = '\"http://m.baidu.com/sf/vsearch?word={}vs{}+{}&pd=realtime_ugc&sa=3&mod=5&p_type=1&data_type=json&atn=list&pn={}\"'.format(a,b,i,pn) print("当前URL:",url) dv_count += get_url(url,data) # 返回 文章数量 相加 pn += 10 time.sleep(5) if __name__ == '__main__': print("百度搜索",custom_time(int(time.time()))) print("\n") print("\n") print("\n") print("\n") t1 = int(time.time()) main(sys.argv[1],sys.argv[2]) t2 = int(time.time()) print("用时",t2-t1)
tian@tiandeMacBook-Air % python3 baidu.py 阿根廷 巴西