微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

import requests,time,re,json,pymongofrom urllib.parse import urlencodefrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoup as bs#连接mongodbclient = 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 Nonedef 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 Falsedef 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()今日得空,发个代码记录一下,感觉自己在代码格式上有些许进步,比以前的代码更公正,可靠性也更强

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐