今日头条图片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 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

时间: 2024-10-16 21:18:42

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

python爬虫 selenium 抓取 今日头条(ajax异步加载)

from selenium import webdriver from lxml import etree from pyquery import PyQuery as pq import time driver = webdriver.Chrome() driver.maximize_window() driver.get('https://www.toutiao.com/') driver.implicitly_wait(10) driver.find_element_by_link_tex

淘宝购物车页面 智能搜索框Ajax异步加载数据

如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区非常的活跃,许多朋友都在不同地方分享了很多优秀的插件.我在相关的网站上找过想实现类似功能的插件,但是没有找到.于是乎,自己动手丰衣足食.自己来搭建智能搜索框下拉列表.当然,如果有类似功能并且常维护Bug的插件,望留言交流. 源码地址: 淘宝购物车页面--PC端和移动端项目实战 首先需要先给大家打一根

jQuery的AJax异步加载片段

主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何内容: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>AJax异步加载</title> <scri

Android开发之图片处理专题(三):利用ThreadPoolExcutor线程池实现多图片的异步加载

在上一篇专题Android开发之图片处理专题(二):利用AsyncTask和回调接口实现图片的异步加载和压缩中我们实现了listView的图片的大量加载.今天,我们换一种方式,采用线程池的方式来实现. 我们需要准备两个东西: 1.图片下载任务类 2.线程池. 1.图片下载任务类. 图片下载任务类,将需要显示的iamgeView,线程通讯消息管理者handler进行了封装.当图片下载无论成功还是失败,handler发送对应的消息,传入的iamgeView显示对应的图片.这里就不在应用软引用技术,采

Android开发之图片处理专题(二):利用AsyncTask和回调接口实现图片的异步加载和压缩

在上一篇专题Android开发之图片处理专题(一):利用软引用构建图片高速缓存中我们讲述了如何利用软引用技术构建高速缓存.那么想要用到图片,首先得有图片的来源.一般而言,一个应用的图片资源都是从服务器处获得的.今天,我们利用Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载里面封装好的httpUtils来实现图片的下载,然后加载到本地配合软引用缓存使用,以一个listView为例子来说明. 一.准备工作 我们需要准备以下几个类(图片对象和软引用缓存类请参考上一篇专

ajax异步加载问题

使用ajax异步加载数据,在之后需要用到这个数据时,应该将之后的js一并写入ajax函数中,否则后面的js不能找到动态拼接的dom节点. 或者将其封装成方法,在ajax动态加载数据的最后调用该方法.

图片高效加载(二) 图片的异步加载

图片的异步加载是利用AsynTask类对图像进行后台加载完成后再给ImageView,先转载一篇前人的较好的总结后面再添加一些自己的见解和贴上完整的实现demo. 前面的转自:https://my.oschina.net/rengwuxian/blog/183802 摘要: 有没有过这种体验:你在Android手机上打开了一个带有含图片的ListView的页面,用手猛地一划,就见那ListView嘎嘎地卡,仿佛每一个新的Item都是顶着阻力蹦出来的一样?看完这篇文章,你将学会怎样避免这种情况的发

WPF技术触屏上的应用系列(五): 图片列表异步加载、手指进行缩小、放大、拖动 、惯性滑入滑出等效果

原文:WPF技术触屏上的应用系列(五): 图片列表异步加载.手指进行缩小.放大.拖动 .惯性滑入滑出等效果 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体机.要求有很炫的展示效果,要有一定的视觉冲击力,可触控操作.当然满足客户的要求也可以有其它途径.但鉴于咱是搞 .NET技术的,首先其冲想到的微软WPF方面,之前对WPF的了解与学习也只是停留在比较浅的层面,没有进一步深入学习与应用.所以在项目接来以后,也就赶鸭子上架了,经过努力

Android中图片的异步加载

转: 1.  为什么要异步加载图片 下载图片比较费时,先显示文字部分,让加载图片的过程在后台,以提升用户体验 2.  SoftReference的作用 栈内存—引用 堆内存—对象 Eg: Object obj = new Object(); Obj = null; 当垃圾收集器启动时,会回收对象: 当一个对象没有任何引用指向,就会被回收. SoftReference<Object>sr = new SoftReference<Object>(new Obnject()); 引用是软