背景

现在有很多自媒体平台,如头条号、搜狐号、大鱼号、百家号等,每个人都可以成为创作者发布自己的作品。如果想把某个作者的文章都下下来,一篇一篇的下载会很麻烦,而用爬虫则会很简单,顺便还能练练手。这里就以抓取规则比较比较简单的搜狐号来开到。

工具

pycharm、Python3、PC

库 os、 re、BeautifulSoup、requests、json、urllib.parse

思路

入口URL进入 --> 获取文章地址 --> 获取图片地址 --> 下载文章与图片

注:主线思路很简单,但还是会遇到很多小问题

开始

一、网站分析

1、先选定一个要爬取的自媒体账号,比如随便选的:

2、用fiddler或F12抓包,发现返回的数据包里面不包含连接。这说明连接应该都放在在某个请求里面,而这个请求返回的是json格式。

3、在请求列表里找,最终在这个里面看到了猫腻

用浏览器访问下试试,好多URL和title,就是这个了!

4、在看他的地址结构,pageNumber应该是第几页,xpt是每个自媒体账号的唯一id,pageSize是一页显示多少条信息。

5、点进一篇文章,发现文章内容在<article>标签内

6、分析完成后,可以正式敲代码了。

二、编码

1、先对输入的URL进行拆分,提取xpt

2、创建文件夹,存放爬取的资源

3、然后用pageNumber、xpt、pageSize拼接路径,获取保存URL的页面;将返回的数据转为json格式,解析地址;通过pageNumber自增,循环获取所有页面的地址。

4、将信息保存到本地txt文件

5、遍历获取地址对应的文章内容和图片

6、效果如下

优化

由于加了图片下载,单线程会比较慢,因此可考虑优化成 多线程,效率杠杠滴。

结语

获取.py源码和生成的.exe程序:链接:https://pan.baidu.com/s/1zGOrI5A60oMapRnQyYoG9g 
提取码:hkrh

附件:

# -*- coding: utf-8 -*-import sys, os
import re
import time
from bs4 import BeautifulSoup
import requests
import json
import urllib.parsedef get_url(xpt):  # 获取URL集合url_buf = []  # 存放URLdatas = []pagenumber = 0  # 页数for i in range(20):  # 默认20页pagenumber = pagenumber + 1print(">> 解析第[%d]页" % pagenumber)url_ori = r"https://mp.sohu.com/apiV2/profile/newsListAjax?xpt=" + xpt + "=&pageNumber=" + str(pagenumber) + r"&pageSize=10&categoryId=&_=1550238383382"try:html = requests.get(url_ori).json()html_json = json.loads(html)  # 转为json格式except Exception as e:print(e)finally:if(str(html_json["data"])=="[]"):  # 空数据breakelse:datas.append(html_json["data"])  # 存信息print(datas[pagenumber-1])print("解析完毕\r\n")print(">> 分割地址:")id = 0if (os.path.exists("spider.txt")):  # 如果已经存在os.remove("spider.txt")  # 删除该文件for i in datas:for j in i:id = id + 1title = urllib.parse.unquote(j["title"])  # utf8转中文显示url = "http://" + j["url"].split("//")[1]print("["+str(id)+"] ", title, " ", url)url_buf.append("["+str(id)+"] "+title+" "+url)  # 存入 名称+地址with open("spider.txt", 'a+', encoding='utf-8') as fp:fp.write("*" * 100 + "\n")fp.write("["+str(id)+"] "+title+" "+url+"\n")  # 写入本地文件fp.close()print(">> 地址信息已保存到本地")return url_bufdef get_content(url_buf):  # 获取地址对应的文章内容each_title = ""  # 初始化each_url = ""  # 初始化splits_num = len(url_buf.split(" "))  # 以空格分割字符串if(splits_num > 3):  # 有多余空格,说明标题里含有空格了each_title = url_buf.split(" ")[0] + url_buf.split(" ")[-2]  # 拼接标题else:each_title = url_buf.split(" ")[0] + url_buf.split(" ")[1]  # 拼接标题each_title = re.sub(r'[\|\/\<\>\:\*\?\\\"]', "_", each_title)  # 剔除不合法字符filepath = rootpath + "/" + each_title  # 为每篇文章创建文件夹if(not os.path.exists(filepath)):  # 若不存在,则创建文件夹os.makedirs(filepath)os.chdir(filepath)  # 切换至文件夹each_url = url_buf.split(" ")[-1]  # 获得文章URLheaders = {'User-Agent': r'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',}html = requests.get(each_url, headers=headers)soup = BeautifulSoup(html.text, 'lxml')article = soup.find(class_="article").find_all("p")  # 查找文章内容位置img_urls = soup.find("article").find_all("img")  # 获得文章图片URL集print("*" * 60)print(each_title)print(">> 保存文档 - ", end="")for i in article:line_content = i.get_text()  # 获取标签内的文本# print(line_content)if(line_content != None):  # 文本不为空with open(each_title+r'.txt', 'a+', encoding='utf-8') as fp:fp.write(line_content + "\n")  # 写入本地文件fp.close()print("完毕!")print(">> 保存图片 - %d张" % len(img_urls), end="")for i in range(len(img_urls)):pic_down = requests.get(img_urls[i]["src"])with open(str(i)+r'.jpeg', 'ab+') as fp:fp.write(pic_down.content)fp.close()print("完毕!\r\n")global rootpath  # 全局变量,存放路径
if __name__ == '__main__':# url = "https://www.sohu.com/a/290059377_479499?sec=wd"# html = requests.get(url)# soup = BeautifulSoup(html.text, 'lxml')# img = soup.find("article").find_all("img")# print(img)# print(img[0]["src"])url = input("输入地址,(不输入则默认为机甲同盟个人主页):")if(url == ""):url = "https://mp.sohu.com/profile?xpt=b1NlSFRzMGJ5Sl84dnh2ZllseHMyMGxsejFVSUB3ZWNoYXQuc29odS5jb20="xpt = url.split("=")[1]html = requests.get(url)soup = BeautifulSoup(html.text, 'lxml')name = soup.find(class_="profile_title").get_text().strip()  # 查找搜狐号print("*"*60)print("URL => ", url)print("搜狐号 => ", name)print("*" * 60)print("\r\n")rootpath = os.getcwd() + r"/spider/" + nameif(not os.path.exists(rootpath)):  # 若不存在,则创建文件夹os.makedirs(rootpath)os.chdir(rootpath)  # 切换至文件夹url_buf = get_url(xpt)for i in url_buf:get_content(i)print("\r\n>> 程序结束!<<")

详解爬取搜狐号自媒体的所有文章相关推荐

  1. python爬虫搜狐新闻_应用案例2:爬取搜狐体育的新闻信息

    爬虫学习使用指南 Auth: 王海飞 Data:2018-06-25 Email:779598160@qq.com github:https://github.com/coco369/knowledg ...

  2. Python爬虫——主题爬取搜狐新闻(步骤及代码实现)

    目录 一 .实现思路 二.获取url变化规律 三.爬取新闻名称及其超链接 四.判断与主题的契合度 四.输出结果 五.总代码 一 .实现思路 本次爬取搜狐新闻时政类 获取url--爬取新闻名称及其超链接 ...

  3. #python爬虫#爬取搜狐股票

    爬取搜狐股票 完整程序 完整程序 利用搜狐新闻的股票列表,构造url爬取信息 import requests from bs4 import BeautifulSoup import json imp ...

  4. python爬取搜狐新闻网站所有新闻的标题和正文并按阅读量排行输出

    # _*_ coding: utf-8 _*_ """实现定量爬取搜狐网站新闻 Author: HIKARI Version: V 0.2 ""&qu ...

  5. 搜狐号自媒体搬运,搜狐号运营技术

    搜狐号搬运,搜狐号运营技术 1.开通收益 想要赚钱,首要就要开通收益,搜狐号开通收益的条件有: 入驻平台60天; 近60天内,帐号无违反平台相关规定的行为; 申请广告分成要求:上月阅读量2万 2.收益 ...

  6. python证券_基于Python爬取搜狐证券股票过程解析

    数据的爬取 我们以上证50的股票为例,首先需要找到一个网站包含这五十只股票的股票代码,例如这里我们使用搜狐证券提供的列表. 可以看到,在这个网站中有上证50的所有股票代码,我们希望爬取的就是这个包含股 ...

  7. python爬虫股票上证指数_Python爬虫爬取搜狐证券股票数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于IT信息教室,作者:M先森看世界 数据的爬取 我们以上证50的股票为例,首先需 ...

  8. Python爬取搜狐车型数据

    主要工具Python+selenium+Excel 因为工作需要想要获得车型参数数据,查找了网络上面的教程和相关的文章都没有达到我想要的效果,所以自己慢慢摸索着写了这些代码,可能有一些代码繁琐且没有必 ...

  9. selenium无头浏览爬取搜狐新闻

    个人笔记 import requests import re from lxml import etree from selenium import webdriver from selenium.w ...

最新文章

  1. (记忆宏)Function问题
  2. WordPress插件开发: 文章同步到OSC博客插件(OscPress) (四)
  3. 分布式系统一致性问题解决实战
  4. linux 从grub 进入rescue,在grub的rescue模式修复linux引导
  5. Elastic Search入门:架构说明及Docker方式体验
  6. ABAP中的Table Control编程
  7. 最挑战程序员的9大任务,你都干过哪些?
  8. nuxt route 全局管理 route.beforeEach 替代
  9. 这些科技大佬们的星座你知道吗
  10. MTK:文件操作接口详解
  11. java ftpclient quit_一步一步android(6):关于FtpClient类的学习
  12. 前端aes专用秘钥加解密_Javascript实现前端AES加密解密功能
  13. utc时间 单位换算_OSAL之时钟分析
  14. 网吧软件经典大集合.各种网管工具
  15. html5 颜色对应8进制,十进制字体颜色html代码参照表 rgb值颜色查询对照表
  16. vue优化技巧之Object.freeze()
  17. Java中的回溯算法
  18. 单独使用Quartz 2.1.7 时Job属性Spring无法注入
  19. Android第三方支付--微信支付
  20. unity之环状图片轮播

热门文章

  1. 创建属于中国的Albers投影并转换
  2. 解决Chrome打印宋体不支持加粗效果
  3. 广东省大学计算机一级考试试题类型,大学计算机一级考试试题及答案
  4. Form2(子窗体)调用Form1(父窗体)的控件
  5. RNA 25. SCI文章中估计组织浸润免疫细胞和基质细胞群的群体丰度(MCP-counter)
  6. 苹果内购退款需要注意的一些东西
  7. python中yield,send及next的使用
  8. ❤️手把手教你配置服务器板载raid❤️
  9. 通过链接自动生成二维码
  10. 《刻意练习》读书笔记思维导图精华版,探索成功的秘诀