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

研究发现,这玩意没有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. jacoco收集探针结果时机_滴滴开源Super-jacoco:java代码覆盖率收集平台
  2. 屏幕旋转的处理方法,实现视图位置的变化
  3. 软件设计师考试上午真题 考前速记
  4. 绝望:对不完的数,加不完的班
  5. python字符串解释_python基础之字符串详解
  6. 如何销毁一个实例化对象_JAVA中如何创建和销毁对象
  7. 为 Node.js 开发者准备的 8 本免费在线电子书(转)
  8. 【Elasticsearch】Request cannot be executed;I/O reactor status :STOPPED.
  9. Vuforia开发完全指南
  10. 中南大学 科学计算和MATLAB 初级语言学习01_02
  11. web安全day41:三种典型渗透测试流程
  12. 最全面的linux网站
  13. linux修改u盘mbr,远景论坛U盘版 完美 4G/8G/16G WINPE+LINUXPE+MACPE+10.9正式版MBR安装版 制作超简单...
  14. 车靓靓·微水上门洗车项目介绍
  15. java零基础Ⅰ-- 1.java 概述
  16. PACP学习笔记三:PCAP方法说明
  17. 南繁水稻国家公园国稻种芯(三亚)水稻节功能性农业产业园
  18. myBase/Webcollect网页插件
  19. 【MySQL多表操作练习】
  20. 各品类市场占有率——通过互联网大数据了解各品类的市场占有率

热门文章

  1. HTML的10个标签详解
  2. Power BI-杭州银杏观赏地点可视化
  3. 第四次实验 第一期 紫金学院 Java 抽象类和接口
  4. java猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃掉一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。...
  5. sqluldr2 完美导出 ORACLE上亿条数据
  6. linux如何打命令提示符,Linux Shell命令提示符
  7. Android录音文件
  8. 你有多了解hybris
  9. c语言大一期中考试复盘
  10. 在win7上安装ft232r usb uart 驱动