在这之前从未了解过小红书,然后习惯性地百度了一下。发现是这样的

研究发现,这玩意没有pc端的接口,也就是说没办法直接从pc端抓取数据。好吧,放弃。不过pc端还是有用处的

打开社区精选,点开几个推送详情页看了看,发现所有的文章url都是https://www.xiaohongshu.com/discovery/item/ + 文章绑定的一串字符,这个很关键。然后pc端不行,就只能从手机端想办法,下载了小红书的app,又看了一下微信的小红书小程序,试着用fidder抓包,然后发现小程序的更好抓,还是得借马爸爸的门啊!

采集路径有了,第一个问题顺利解决,然后开始fidder抓包。

json文件找到了。观察一下json文件里的参数,会发现。跟每一个title的同级都有一个绑定的id。看起来有点眼熟啊,是不是跟刚才社区精选看到的url的id很像?于是复制一个到pc端测试,果然

好了,第二个问题解决,现在就要思考如何拿到json文件的数据。然后批量访问

试了一下添加cookie,ua,referer。结果失败

然后一股脑把所有参数都带上了去访问,结果成功

没挨个测试反正能成功就行,有兴趣的朋友可以挨个测试,看看哪些是必要参数。

交个底,大部分参数都是固定的,只有请求头里的keyword跟X-Sign是变动的,需要手动获取。自此大部分问题解决

还有个最操蛋的问题,就是小红书对访问频率太敏感,正常的套路去爬基本上两三篇文章最多就给你弹验证,然后程序就挂了。试过添加随机请求头,不过不管用。唯一的两个办法是使用代理,这样的话基本上你要爬多少篇文章就得准备多少代理,免费ip不好用,又没钱买付费代理,这条路我不走了,有条件的朋友可以去试试,我是用的第二个方法,selenium+time降低访问速度。反正不要求效率,让程序慢慢跑就完事了,省钱省事不香吗?哈哈哈

好了,直接贴代码。

import time
import pymysql
import requests
import re
import urllib3
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
import jsonclass Fuck_xhs(object):def __init__(self):urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)self.conn = pymysql.connect(xxxxx, 自己写)self.cursor = self.conn.cursor()self.url = 'https://www.xiaohongshu.com/fe_api/burdock/weixin/v2/search/notes?'self.key_dict = {'1': 'Xd44b23783ad8f18c2e41c045a0cda867','2': 'Xe8b3f71b7585c080e9ca55e7d1b034e0','3': 'X2351ff0514bb05145e8171975fe1d96d','4': 'X2422fd5312cf50b12c722e1d63b2f9aa','5': 'X44d5cf63fb658c609be10404b77291d5',}with open('小红书url.txt', 'r', encoding='utf-8')as f:r = f.read().replace('\ufeff', '')self.old_list = r.split('\n')print(self.old_list)options = Options()options.add_argument('--headless')self.chrome = Chrome(options=options)def get_detail_url(self):for key, value in self.key_dict.items():headers = {'Host': 'www.xiaohongshu.com','Connection': 'keep-alive','Authorization': 'wxmp.4aad8f54-3422-4d76-b440-5f4cce8d0907','Device-Fingerprint': 'WHJMrwNw1k/Ff2NfArpikjizTJkAdQe2Y1P0AQTa74gJcSlBSWoMjTXYq+VUDRGsE9VCMBXrfD5W9YT2GqNMbnISuxoWerClbdCW1tldyDzmauSxIJm5Txg==1487582755342','User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat','X-Sign': value,'content-type': 'application/json','Referer': 'https://servicewechat.com/wxffc08ac7df482a27/378/page-frame.html','Accept-Encoding': 'gzip, deflate, br',}params = {'keyword': '揭阳周边游','sortBy': 'general','page': key,'pageSize': '20','needGifCover': 'true',}res = requests.get(self.url, headers=headers, params=params, verify=False).textprint(res)res_dict = json.loads(res)notes = res_dict['data']['notes']for note in notes:id = note['id']print(id)self.detail_url = 'https://www.xiaohongshu.com/discovery/item/' + idprint(self.detail_url)if self.detail_url in self.old_list:print('链接已存在。')continueelse:with open('小红书url.txt', 'a', encoding='utf-8')as w:w.write('\n')w.write(self.detail_url)self.get_detail()continueself.conn.close()def get_detail(self):self.chrome.get(self.detail_url)time.sleep(1.5)try:video = self.chrome.find_element_by_xpath('//div[@class="videoframe"]')if video:return Noneexcept:passself.content_pic = '<ul>' + str(self.chrome.find_element_by_class_name("slide").get_attribute('innerHTML')) + '</ul>'print(self.content_pic)urls = re.findall(r'style="background-image.*?;"', self.content_pic, re.DOTALL)for ur in urls:print('ur的值为%s' % ur)u = ''.join(re.findall(r'url\((.*?)\)', ur))url = 'http:' + u.replace('&quot;', '').replace('&quot', '').replace('https:', '').replace('http:','') + '.jpg'print(url)self.content_pic = str(self.content_pic).replace(ur, 'src=' + '"' + url + '"').replace('span', 'img').replace('<i data','<img data').replace('</i>', '</img>')print(self.content_pic)self.content = self.chrome.find_element_by_class_name('content').get_attribute('innerHTML')try:self.author = self.chrome.find_element_by_class_name('name-detail').textprint(self.author)except:self.author = ' 'try:self.title = self.chrome.find_element_by_class_name('title').textif not self.title:self.title = self.chrome.find_element_by_class_name('as-p').textprint(self.title)except:self.title = ' 'try:span = self.chrome.find_elements_by_xpath('//div[@class="operation-block"]/span')self.like = span[0].find_element_by_xpath('./span').textself.comment = span[1].find_element_by_xpath('./span').textself.star = span[2].find_element_by_xpath('./span').textprint(self.like, self.comment, self.star)except:self.like = ' 'self.comment = ' 'self.star = ' 'try:self.b_q = self.chrome.find_elements_by_xpath('//div[@class="keywords"]/a[@class="keyword category"]')print(self.b_q)a_l = []for bq in self.b_q:a = bq.texta_l.append(a)self.a_l = str(a_l).replace('[', '').replace(']', '').replace("'", '').replace(',', ',')print(self.a_l)except:self.a_l = ' 'try:self.pub_time = str(self.chrome.find_element_by_xpath('//div[@class="publish-date"]/span').text).replace('发布于', '')print(self.pub_time)except:self.pub_time = ' 'try:self.author_img = self.chrome.find_element_by_xpath('//div[@class="left-img"]/img').get_attribute('src')print(self.author_img)except:self.author_img = ' 'time.sleep(5)self.create_time = time.strftime("%Y-%m-%d %H:%M:%S")print(self.create_time)self.is_import = '0'time.sleep(3)self.deposit_mysql()def deposit_mysql(self):sql = "insert into xhs_article(id, author, author_img, title, text_img, content, like_count, review_count, collect_count, org_url, publish_time, keyword_tag, create_time, is_import, import_time) values(null,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,null)"self.cursor.execute(sql, (str(self.author), str(self.author_img), str(self.title), str(self.content_pic), str(self.content),str(self.like), str(self.comment),str(self.star), str(self.detail_url), str(self.pub_time), str(self.a_l), str(self.create_time),str(self.is_import)))self.conn.commit()return Noneif __name__ == '__main__':xhs = Fuck_xhs()xhs.get_detail_url()

入库

代码2020/08/14下午刚做了优化,测试可用,分享。

2020-10-12记 如果报错,先考虑参数过期情况,毕竟都两月了,自行更换最新的cookie再尝试!

Python-抓取小红书文章的心路历程相关推荐

  1. python抓取小红书_小红书很难爬?最新爬取方法教给你啦~

    前言 大家好,我是Kuls. 之前写的那篇App抓包软件charles的配置说过,超过30在看,马上更下一篇.有读者问我怎么爬App,我手把手教了他(多图警告) 所以加班加点给大家写了今天这篇文章. ...

  2. python日志保存为html文件,用 Python 抓取公号文章保存成 HTML

    上次为大家介绍了如果用 Python 抓取公号文章并保存成 PDF 文件存储到本地.但用这种方式下载的 PDF 只有文字没有图片,所以只适用于没有图片或图片不重要的公众号,那如果我想要图片和文字下载下 ...

  3. 带着大家用Python爬取小红书,完完整整的全过程

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于Python进击者 ,作者kuls Python爬虫.数据分析.网站开发等案例 ...

  4. selenium+python爬取简书文章

    页面加载逻辑 当你兴致勃勃地从网上学习了基本的爬虫知识后就像找个目标实践下,拥有大量文章的简书包含了大量的有价值信息,所以自然成为了你的选择目标,如果你尝试之后会发现并没有想象的那么简单,因为里面包含 ...

  5. dataframe保存为txt_竟然可以用 Python 抓取公号文章保存成 PDF

    . 游戏的多维数据集的形状概念 Python技术 人生苦短,我用 Python! 今天为大家介绍如何将自己喜欢的公众号的历史文章转成 PDF 保存到本地.前几天还有朋友再问,能不能帮把某某公众号的文章 ...

  6. python response重头开始_用 Python 抓取公号文章保存成 PDF

    今天为大家介绍如何将自己喜欢的公众号的历史文章转成 PDF 保存到本地.前几天还有朋友再问,能不能帮把某某公众号的文章下载下来,因为他很喜欢这个号的文章,但由于微信上查看历史文章不能排序,一些较早期的 ...

  7. 用 Python 抓取公号文章保存成 PDF

    今天为大家介绍如何将自己喜欢的公众号的历史文章转成 PDF 保存到本地.前几天还有朋友再问,能不能帮把某某公众号的文章下载下来,因为他很喜欢这个号的文章,但由于微信上查看历史文章不能排序,一些较早期的 ...

  8. 实战项目五:抓取简书文章信息

    源码: from fake_useragent import UserAgent from lxml import etree import lxml,requestsurl="https: ...

  9. 抓取小红书 模拟器提示版本低 对接anoyi接口的api

    模拟器运行提示版本低 用微博账号登录可破 对接anoyi接口需特定apk 这个版本的apk抓出来的url符合要求 https://www.xiaohongshu.com/api/sns/v3/user ...

最新文章

  1. Unity版本更新关注
  2. @value 注入静态属性_SpringBoot使用@Value读取属性值
  3. Python中type()详解:动态创建类
  4. rails应用中各数据平台的对接
  5. 只有一个显示器但是显示两个显示器_小米34寸曲面显示器深度体验 办公体验极佳 但是还有个大弱点...
  6. 动态链接(指向运行时常量池的方法引用)
  7. redis实现轮询算法_【07期】Redis中是如何实现分布式锁的?
  8. TortoiseGit上传代码报错error:1407742E
  9. 空间统计分析_空间汇总统计分析的小技巧:构造单调函数
  10. Java自动化测试框架-08 - TestNG之并行性和超时篇 (详细教程)
  11. Openning Day
  12. MacBook安装jdk8
  13. 谷歌FLASH无法添加保存网站
  14. 基于X射线的工业无损检测系统
  15. 12级计算机动画制作专业,计算机专业技术12级是什么意思?
  16. easyui的filebox过滤文件
  17. STM32F103_study51_The punctual atoms(STM32 Timer interrupt )
  18. matlab画s域零极点图,信号与系统的S域分析.ppt
  19. 在centos上安装vmware14
  20. win10强制关闭飞行模式_让你的电脑1台变n台 win10自带虚拟机Hyper-V讲解

热门文章

  1. 挺复杂!智能汽车带飞软件生态
  2. “量子霸权”道路上的是与非,物理学家如何做到“信达雅”?
  3. 华为mate40e24小时制设置方法介绍
  4. Docker之nginx部署
  5. MATLABsimulink对于软件无线电设计的支持
  6. 淘宝开放平台淘宝店铺OAuth2.0订单商品接口接入解决方案
  7. 润乾报表实现计算过程性能优化
  8. Unity——在运行时修改Animator Controller状态机中的动画片段
  9. 惠普笔记本型号的详细解释
  10. linux制作win10安装u盘,win10u盘安装系统怎样全新安装