资讯专栏INFORMATION COLUMN

用Python编写一个简单的爬虫

赵春朋 / 1009人阅读

摘要:进入这篇图集在中并没有发现图集有关的请求接口可能也是混排的我们可以查看页面的源码原来真的是混排的写法看了一下这里用到具体怎么实现的我们不去探讨了我们只需要取出数据即可。嘿嘿看我的美图去了。

作者信息:

Author : 黄志成(小黄)

博客地址: 博客

呐,这是一篇福利教程.为什么这么说呢.我们要爬取的内容是美图网站(嘿嘿,老司机都懂的)

废话不多说.开始今天的表演.

这个图集网站不要问我怎么来的.绝对不是我刻意找的.(其实是看了别的发的一篇文章,就想自己动手实现一下)

我们今天的任务就是 将这些图集保存下来。

首先我们需要获取到所有的列表,我们往下拉动滚动条,拉到底,会继续自动加载内容,我们通过浏览器的NetWork可以发现请求的数据包

我们来分析一下这个数据包

URL:https://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E6%B8%85%E7%BA%AF%E7%BE%8E%E5%A5%B3&autoload=true&count=20&cur_tab=3&from=gallery

通过url我们可以知道几个重要的参数

offset 偏移量
count 数量
cur_tab 当前分类

这里很多朋友可能对偏移量不太了解,这里我用sql语句表示一下,如果了解sql的朋友 肯定就知道了

mysql> SELECT * FROM art LIMIT offset , count

mysql> SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15

mysql> SELECT * FROM table LIMIT 95,1; // 检索记录行 96

这里我每次读取一条,对一条进行操作.

URL:https://www.toutiao.com/search_content/?offset=1&format=json&keyword=%E6%B8%85%E7%BA%AF%E7%BE%8E%E5%A5%B3&autoload=true&count=1&cur_tab=3&from=gallery

每次对offset 进行自增即可了

我们点击进去 看看数据的结构.

我们需要获取到该图集的链接。

进入这篇图集,在NetWork中并没有发现图集有关的请求接口,可能也是混排的.

我们可以查看页面的源码

原来真的是混排的写法.看了一下这里用到vue.具体怎么实现的我们不去探讨了,我们只需要取出数据即可。

那如何取出呢? 提供两种方法,一种就是正则,一种就是自己写一个取文本的函数.这里我用第二种作为演示,下面是取文本的函数.

def txt_wrap_by(start_str, end, html):
    start = html.find(start_str)
    if start >= 0:
        start += len(start_str)
        end = html.find(end, start)
        if end >= 0:
            return html[start:end].strip()

我们取出 JSON.parse("") 中的数据

观察数据,可以发现 我们取出 url 就可以了,这里的数据是json但是被转义了,我们就通过正则取出吧

正则的语法如图上,最后我也会放出所有代码滴,大家放心.

取到了uri 我们只要在前面拼上 http://p3.pstatp.com/ 即可.

然后保存为图片即可~

上面说的都是思路,最后放出代码~

import requests,os,json,re,datetime

# 主函数
def main():
    foreach_art_list()

def foreach_art_list():
    # 判断目录下是否存在jilv.txt文件 如果存在则读取里面的数值
    if os.path.exists("./jilv.txt"):
        f = open("./jilv.txt")
        n = f.read()
        n = int(n)
        f.close()
    else:
        n = 1    
    while True:
        url = "http://www.toutiao.com/search_content/?offset=" + str(n) + "&format=json&keyword=%E6%B8%85%E7%BA%AF%E7%BE%8E%E5%A5%B3&autoload=true&count=1&cur_tab=3&from=gallery"
        re = requests.get(url)
        data = re.json()["data"]
        if not data:
            break
        # 运行图片下载函数
        download_pic(data[0]["article_url"],n)
        n = n+1
        # 将n写入文件 防止程序运行出错 可以继续运行
        with open("./jilv.txt", "w") as f:
            f.write(str(n))

def download_pic(url,n):
    download_pic_url = "http://p3.pstatp.com/"
    # 这里必须带上协议头,否则会请求失败
    header = {
        "user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36"
    }
    res = requests.get(url,headers = header)
    content = res.text
    img_list_json = txt_wrap_by("gallery: JSON.parse("",""),",content)
    # 正则获取所有的uri
    img_list = re.findall(r"uri":"(.*?)"",img_list_json)
    #判断是否有此目录
    if "img" not in os.listdir("."):
        os.mkdir("./img")
    if str(n) not in os.listdir("./img"):
        os.mkdir("./img/"+str(n))
    for v in img_list:
        img_path = download_pic_url + v
        img_path = img_path.replace("", "")
        # 读取图片
        atlas = requests.get(img_path).content
        # 保存图片
        with open( "./img/" + str(n) + "/" + str(datetime.datetime.now()) +".jpg", "wb") as f:  # 把图片写入文件内
            f.write(atlas)


# 取出两个文本之间的内容
def txt_wrap_by(start_str, end, html):
    start = html.find(start_str)
    if start >= 0:
        start += len(start_str)
        end = html.find(end, start)
        if end >= 0:
            return html[start:end].strip()

# 运行程序
main()

最后 展示一下 运行结果:

这个程序还有许多不完善的地方,我会在之后教程加入 redis 和 多线程 的写法,让他成为最快的爬虫~

敬请期待~ 今天就到这里了. 又是周末!祝大家周末愉快。嘿嘿~ 看我的美图去了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44659.html

相关文章

  • Python爬虫建站入门手记——从零开始建立采集站点(二:编写爬虫

    摘要:接上回第二部分,编写爬虫。进入微信嵌套选择图片和上传图片接口,实现一键上传图片,遇到问题看吧,我现在已经可以通过爬虫获取的提问标题了。微信故意省略想做小偷站的,看到这里基本上就能搞出来了。下一篇,采集入库 上回,我装了环境 也就是一对乱七八糟的东西 装了pip,用pip装了virtualenv,建立了一个virtualenv,在这个virtualenv里面,装了Django,创建了一个...

    Codeing_ls 评论0 收藏0
  • 谈谈对Python爬虫理解

    摘要:爬虫也可以称为爬虫不知从何时起,这门语言和爬虫就像一对恋人,二者如胶似漆,形影不离,你中有我我中有你,一提起爬虫,就会想到,一说起,就会想到人工智能和爬虫所以,一般说爬虫的时候,大部分程序员潜意识里都会联想为爬虫,为什么会这样,我觉得有两个 爬虫也可以称为Python爬虫 不知从何时起,Python这门语言和爬虫就像一对恋人,二者如胶似漆 ,形影不离,你中有我、我中有你,一提起爬虫,就...

    Yang_River 评论0 收藏0
  • 如何实现一个Python爬虫框架

    摘要:这篇文章的题目有点大,但这并不是说我自觉对爬虫这块有多大见解,我只不过是想将自己的一些经验付诸于笔,对于如何写一个爬虫框架,我想一步一步地结合具体代码来讲述如何从零开始编写一个自己的爬虫框架年到如今,我花精力比较多的一个开源项目算是了,这是 showImg(https://segmentfault.com/img/remote/1460000018513379); 这篇文章的题目有点大...

    feng409 评论0 收藏0
  • 爬虫 - 收藏集 - 掘金

    摘要:在这之前,还是有必要对一些概念超轻量级反爬虫方案后端掘金前言爬虫和反爬虫日益成为每家公司的标配系统。 爬虫修炼之道——从网页中提取结构化数据并保存(以爬取糗百文本板块所有糗事为例) - 后端 - 掘金欢迎大家关注我的专题:爬虫修炼之道 上篇 爬虫修炼之道——编写一个爬取多页面的网络爬虫主要讲解了如何使用python编写一个可以下载多页面的爬虫,如何将相对URL转为绝对URL,如何限速,...

    1fe1se 评论0 收藏0
  • Python

    摘要:最近看前端都展开了几场而我大知乎最热语言还没有相关。有关书籍的介绍,大部分截取自是官方介绍。但从开始,标准库为我们提供了模块,它提供了和两个类,实现了对和的进一步抽象,对编写线程池进程池提供了直接的支持。 《流畅的python》阅读笔记 《流畅的python》是一本适合python进阶的书, 里面介绍的基本都是高级的python用法. 对于初学python的人来说, 基础大概也就够用了...

    dailybird 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<