简书文章标题、链接的爬取

  @绳系想爬取公众号上的文章标题,可惜我不会。
  紧急恶补了一下爬取,试着写了一个小程序,可以爬取绳系的简书文章的标题和链接。记录一下过程。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容