python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例


Posted in Python onMarch 10, 2020

使用python爬虫库requests,urllib爬取今日头条街拍美图

代码均有注释

import re,json,requests,os
from hashlib import md5
from urllib.parse import urlencode
from requests.exceptions import RequestException
from bs4 import BeautifulSoup
from multiprocessing import Pool
#请求索引页
def get_page_index(offset,keyword):
  #传送的数据
  data={
    'offset': offset,
    'format': 'json',
    'keyword': keyword,
    'autoload': 'true',
    'count': '20',
    'cur_tab': 1
  }
  #自动编码为服务器可识别的url
  url="https://www.toutiao.com/search_content/?"+urlencode(data)
  #异常处理
  try:
    #获取返回的网页
    response=requests.get(url)
    #判断网页的状态码是否正常获取
    if response.status_code==200:
      #返回解码后的网页
      return response.text
    #不正常获取,返回None
    return None
  except RequestException:
    #提示信息
    print("请求索引页出错")
    return None
#解析请求的索引网页数据
def parse_page_index(html):
  #json加载转换
  data=json.loads(html)
  #数据为真,并且data键值存在与数据中
  if data and 'data' in data.keys():
    #遍历返回图集所在的url
    for item in data.get('data'):
      yield item.get('article_url')
#图集详情页请求
def get_page_detail(url):
  #设置UA,模拟浏览器正常访问
  head = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  #异常处理
  try:
    response=requests.get(url,headers=head)
    if response.status_code==200:
      return response.text
    return None
  except RequestException:
    print("请求详情页出错")
    return None
#解析图集详情页的数据
def parse_page_detail(html,url):
  #异常处理
  try:
    #格式转换与图集标题提取
    soup=BeautifulSoup(html,'lxml')
    title=soup.select('title')[0].get_text()
    print(title)
    #正则查找图集链接
    image_pattern = re.compile('gallery: (.*?),\n', re.S)
    result = re.search(image_pattern, html)
    if result:
      #数据的优化
      result=result.group(1)
      result = result[12:]
      result = result[:-2]
      #替换
      result = re.sub(r'\\', '', result)
      #json加载
      data = json.loads(result)
      #判断数据不为空,并确保sub——images在其中
      if data and 'sub_images' in data.keys():
        #sub_images数据提取
        sub_images=data.get('sub_images')
        #列表数据提取
        images=[item.get('url') for item in sub_images]
        #图片下载
        for image in images:download_images(image)
        #返回字典
        return {
          'title':title,
          'url':url,
          'images':images
        }
  except Exception:
    pass
#图片url请求
def download_images(url):
  #提示信息
  print('正在下载',url)
  #浏览器模拟
  head = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
  #异常处理
  try:
    response = requests.get(url, headers=head)
    if response.status_code == 200:
      #图片保存
      save_image(response.content)
    return None
  except RequestException:
    print("请求图片出错")
    return None
#图片保存
def save_image(content):
  #判断文件夹是否存在,不存在则创建
  if '街拍' not in os.listdir():
    os.makedirs('街拍')
  #设置写入文件所在文件夹位置
  os.chdir('E:\python写网路爬虫\CSDN爬虫学习\街拍')
  #路径,名称,后缀
  file_path='{0}/{1}.{2}'.format(os.getcwd(),md5(content).hexdigest(),'jpg')
  #图片保存
  with open(file_path,'wb') as f:
      f.write(content)
      f.close()
#主函数
def mian(offset):
  #网页获取
  html=get_page_index(offset,'街拍')
  #图集url
  for url in parse_page_index(html):
    if url!=None:
      #图集网页详情
      html=get_page_detail(url)
      #图集内容
      result=parse_page_detail(html,url)
if __name__ == '__main__':
  #创建访问的列表(0-9)页
  group=[i*10 for i in range(10)]
  #创建多线程进程池
  pool=Pool()
  #进程池启动,传入的数据
  pool.map(mian,group)

爬取图片如下

python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例

本文主要讲解了python爬虫库requests、urllib与OS模块结合使用爬取今日头条搜索内容的实例,更多关于python爬虫相关知识请查看下面的相关链接

Python 相关文章推荐
Python实现求最大公约数及判断素数的方法
May 26 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 Python
python实现ID3决策树算法
Aug 29 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
Python对列表的操作知识点详解
Aug 20 Python
基于python实现从尾到头打印链表
Nov 02 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
关于keras中keras.layers.merge的用法说明
May 23 Python
Python语言内置数据类型
Feb 24 Python
python+gdal+遥感图像拼接(mosaic)的实例
Mar 10 #Python
python获取栅格点和面值的实现
Mar 10 #Python
Python列表切片常用操作实例解析
Mar 10 #Python
Python numpy多维数组实现原理详解
Mar 10 #Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 #Python
Python字符串hashlib加密模块使用案例
Mar 10 #Python
Python中求对数方法总结
Mar 10 #Python
You might like
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
浅析PHP类的反射来实现依赖注入过程
2018/02/06 PHP
几个有趣的Javascript Hack
2010/07/24 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
JS打印组合功能
2016/08/04 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
手把手教你python实现SVM算法
2017/12/27 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
使用CSS3实现SVG路径描边动画效果入门教程
2019/10/21 HTML / CSS
一套带答案的C++笔试题
2014/01/10 面试题
大专计算机个人求职的自我评价
2013/10/21 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
主持词开场白
2014/03/17 职场文书
入党自我鉴定
2014/03/25 职场文书
年会主持词结束语
2014/03/27 职场文书
品牌推广活动策划方案
2014/08/19 职场文书
儿园租房协议书范本
2014/12/02 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
AJAX实现指定部分页面刷新效果
2021/10/16 Javascript
Java并发编程之原子性-Atomic的使用
2022/03/16 Java/Android