社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

这是一篇福利教程,用Python编写一个简单的爬虫

Python网络爬虫与数据挖掘 • 7 年前 • 487 次点击  

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

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

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

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

首先我们需要获取到所有的列表,我们往下拉动滚动条,拉到底,会继续自动加载内容,我们通过浏览器的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://segmentfault.com/a/1190000013953659


学习Python和网络爬虫,关注公众号:datanami

近期文章:

  1. python实战,教你用微信每天给女朋友说晚安

  2. Python后端架构演进

  3. 给Python新手的一道面试题:如何正确读写文件

  4. wtfPython—Python中一些奇妙的代码

  5. Python爬虫库-Beautiful Soup的使用


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/6y80l9zS15
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/21840