@绳系想爬取公众号上的文章标题,可惜我不会。
紧急恶补了一下爬取,试着写了一个小程序,可以爬取绳系的简书文章的标题和链接。记录一下过程。
1、分析页面结构
可以发现需要爬取的
- 文章在<li>这个标签下,
- <a>标签为标题和链接,
- <p>为文章摘要,
- 下面还有作者名字、点赞数等等,
这里主要需要获取标题、摘要以及文章链接即可。
2、处理获取到的文本
爬虫爬下来的是整个页面的xml文本,需要找到我们所需要的东西还得经过处理才行,这里选择用xpath来处理,我觉得还挺好用的。
xpath相关语法可以参照这个:
http://www.w3school.com.cn/xpath/xpath_syntax.asp
先设置各个路径如下
#获取所有 li标签
xpath_items = '//ul[@class="note-list"]/li'
#对每个 li标签再提取
xpath_link = './div/a/@href'
xpath_title = './div/a[@class="title"]/text()'
xpath_abstract='./div/p/text()'
使用request的get方法获取页面,之后进行处理:
3、解决页面自动翻页问题
Ajax动态加载参考
(https://zhuanlan.zhihu.com/p/27346009)
翻页时页面url不变,调用的request 增加了页码。
此时需要打开Chrome的Network,这种技术的文档属于XHR文件,打开后可以看到一个新的request url,其中添加了order_by =added_at 和page=2,方法还是get方法。往下继续翻可以看到只是page在改变,这样的网站简直简单多了。
那么可以设置一个循环来实现页面的增加。
4、Python代码
爬取绳系的简书文章的标题、摘要以及文章链接。结果存到excel表中。
序号 | 链接 | 标题 | 摘要 |
---|---|---|---|
1 | https://www.jianshu.com/p/2a3772293e2d | 这是绳系给你的能量 | 甘为人梯,近我者富,每天给一个人提供价值。 |
2 | https://www.jianshu.com/p/6cc045b5d40c | 15周 每个人都需要能量 | 你好,我是绳系。 |
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 12 11:36:28 2022
@author: dalong10
"""
import requests
from lxml import etree
import time
import socket
import xlwt
socket.setdefaulttimeout(20)
#请求头
headers1 = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Content-Type': 'application/x-www-form-urlencoded',
'Proxy-Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36',
}
#获取所有 li标签
xpath_items = '//ul[@class="note-list"]/li'
#对每个 li标签再提取
xpath_link = './div/a/@href'
xpath_title = './div/a[@class="title"]/text()'
xpath_abstract='./div/p/text()'
a='added_at'
count=1
book = xlwt.Workbook() # 创建excel文件
sheet = book.add_sheet('sheet1') # 创建一个表
title = ['序号','链接', '标题', '摘要']
for col in range(len(title)): # 存入第一行标题
sheet.write(0, col, title[col])
row=1
#获取和解析网页
while count<43:
#proxy = random.choice(proxy_list)
#print(proxy)
r1 = requests.get('https://www.jianshu.com/u/3e0a90a51887?order_by={}&page={}'.format(a,count), headers=headers1)
print('https://www.jianshu.com/u/3e0a90a51887?order_by={}&page={}'.format(a,count))
#r1.encoding = r1.apparent_encoding
dom1 = etree.HTML(r1.text)
print(r1.status_code)
#获取所有的文章标签
items1 = dom1.xpath(xpath_items)
for article in items1:
t = {}
t['link'] = 'https://www.jianshu.com'+article.xpath(xpath_link)[0]
t['title'] = article.xpath(xpath_title)[0]
t['abstract']=article.xpath(xpath_abstract)[0]
sheet.write(row, 0, row)
sheet.write(row, 1, t['link'])
sheet.write(row, 2, t['title'])
sheet.write(row, 3, t['abstract'])
row=row+1
print(row)
print(t)
#解析完毕
count=count+1
print(count)
r1.close()
time.sleep(5)
#存盘
book.save('shengji.xls')
5、参考资料
1、「Cooooooooco」的博客https://blog.csdn.net/Cooooooooco/article/details/85237968