今日头条图片ajax异步加载爬取,并保存至mongodb,以及代码写法的改进

import requests,time,re,json,pymongo
from urllib.parse import urlencode
from requests.exceptions import RequestException
from bs4 import BeautifulSoup as bs

#连接mongodb
client = pymongo.MongoClient(host='localhost',port=27017)
#指定数据库名称
db = client.toutiao

#应对反扒机制, 不加useragent 爬取不到内容
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
}

def get_page_index(offset,keyword):
#传递参数 需要传递一个字典格式 #通过分析发现异步加载需要改变 offset这个参数
data = {
"offset": offset,
"format": "json",
"keyword": keyword,
"autoload": "true",
"count": 20,
"cur_tab": 1,
"from": "search_tab",
}

#urlencode 可以将字典类型转换为请求参数
url = "https://www.toutiao.com/search_content/?" + urlencode(data)
#url = "https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=1&from=search_tab"
try:
rsp = requests.get(url,headers=headers)
if rsp.status_code == 200: #如果等于200 访问成功
#print(rsp.text)
return rsp.text
else:
#print(1)
return None
except RequestException: ###需要了解的内容
print("请求出现错误")
return None

#运行main()后 发现返回数据都是json数据 设置解析函数
def parse_page_index(html):
data =json.loads(html)
if data and "data" in data.keys(): #如果确实取回json数据
#用生成器的方法
for item in data.get("data"):
yield item.get("article_url")# and item.get("title")
#yield item.get("title")

#进入每个标题页面 进行解析
def get_page_detail(url):
try:
rsp = requests.get(url,headers=headers)
if rsp.status_code == 200: #如果等于200 访问成功
#print(rsp.text)
return rsp.text
else:
#print(1)
return None
except RequestException: ###需要了解的内容
print("请求出现错误",url)
return None

def parse_page_detail(html,url):
#提取出标题
title = re.compile(r"title: '(.*?)',",re.S).findall(str(html))
title = "".join(title)

#提取标题下每个图片的地址
image_url_list = re.compile(r'http://p(.*?)&quot',re.S).findall(str(html))
IMG_LIST = []
for i in image_url_list:
image_url = "http://p"+ i
IMG_LIST.append(image_url)

return {
"title":title,
"url":url,
"image_list":IMG_LIST
}

#建立一个存储方法 来方便mongodb的存储
def save_to_mongo(focus_info):
if db["toutiao"].insert(focus_info):
print("存储成功")
return True
return False

def main():
html = get_page_index(0,"街拍") #因为设置成函数,传递两个可变的变量,方便日后改变
#print(html)

#遍历提取生成器产生的每个标题链接
for url in parse_page_index(html):
#print(url)
time.sleep(1)
#将得到的标题url传入解析函数
html = get_page_detail(url)
#print(html)

#将标题内的页面传入解析 得到标题 和照片地址的一个合集
focus_info = parse_page_detail(html,url)
#print(focus_info)

save_to_mongo(focus_info)


main()

今日得空,发个代码记录一下,感觉自己在代码格式上有些许进步,比以前的代码更公正,可靠性也更强

转载于:https://www.cnblogs.com/cwkcwk/p/9710752.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值