前言

我之前写了下载单篇文章的接口函数,结合这篇写的,就可以下载所有个人的所有文章了

代码实现

  1. 没什么技术含量就是简单的 xpath 处理,不过有意思的是有一位csdn 员工将自己的博客地址写到源码里面了,是一个隐藏的 div, 不过在代码中我已经给过滤掉了。
  2. 优化了响应时长,毕竟需要分页爬去,如果不用多线程响应时间必然会随着文章分页的增多而增多。
  3. 传递了一个列表给各个的线程,多线程共用一个列表,但是我没给列表访问的时候加锁,我认为没有删除列表中的元素的情况下,列表中的数据不会损失的,只不过添加顺序是变化的(如果这条想法不对,请评论大神一定要给我解答一下),最后根据更新文章时间重新对各个文章进行排序(捞干的就是一个列表中包含多个字典,要求根据字典指定的键值进行字典的排序),用到了 opertor 这个库

代码实现

import requests
from lxml import etree
import re
import threading
import operator def get_page(url):
response = requests.get(url)
all_page = int(re.findall('var listTotal = (.*?) ;',response.text)[0])//20 +1
return all_page def parse_article(url,article_list):
response = requests.get(url).text
x = etree.HTML(response)
x= x.xpath('//div[(@class="article-item-box csdn-tracking-statistics")][not(@style="display: none;")]')
# article_list = [] for item in x:
title = item.xpath('h4/a/text()')[1].strip()
url = item.xpath('h4/a/@href')[0]
pubdata = item.xpath('div[@class="info-box d-flex align-content-center"]/p/span[@class="date"]/text()')[0]
pageviews = item.xpath('div[@class="info-box d-flex align-content-center"]/p[3]/span/span/text()')[0]
comments = item.xpath('div[@class="info-box d-flex align-content-center"]/p[5]/span/span/text()')[0]
article = dict(
title = title,
url = url,
pubdata = pubdata,
pageviews = pageviews,
comments = comments
)
article_list.append(article)
# print(article_list) def main(url):
main_url = url
all_page = get_page(url)
thread_list = []
data = []
for page in range(1,all_page+1):
url = main_url + '/article/list/' + str(page)
t = threading.Thread(target=parse_article,args=(url,data))
t.start()
thread_list.append(t) for t in thread_list:
t.join() data.sort(key=operator.itemgetter('pubdata'))
print(data,len(data)) if __name__ == '__main__':
url = 'https://blog.csdn.net/chouzhou9701'
main(url)

最新文章

  1. JavaMail和James
  2. Object类clone方法的自我理解
  3. [Node.js] 使用node-forge保障Javascript应用的传输安全
  4. iOS 常用控件 参数
  5. Console的使用——Google Chrome代码调试
  6. 每天一个linux命令(6):mv命令
  7. NodeJS学习历程 - (一)工具篇
  8. KVM虚拟化(一)—— 介绍与简单使用
  9. Java程序员必备的 15框开发工具
  10. PHP学习笔记(5) - 选择一个合格的框架
  11. 为什么String要设计成不可变的?
  12. for_each 用法!
  13. 你能相信吗?这些都是由一个DIV元素实现的动画,纯CSS3技术
  14. Powershell 远程连接ARM Windows Server VM 并关闭 Firewall
  15. qt中线程的使用方法
  16. ASP.NET 初识Cookie
  17. centos 7 安装nvidia显卡驱动
  18. VS2010创建和调用动态链接库
  19. Hadoop伪分布式配置
  20. VIM快速复制多行

热门文章

  1. 【设计模式】Java设计模式 - 享元模式
  2. Fluentd部署:如何监控Fluentd
  3. 为什么阿里Java开发手册不推荐使用Timestamp
  4. POJ3237 Tree (树链剖分)
  5. VLQ & Base64 VLQ 编码方式的原理及代码实现
  6. MYSQL-->函数与约束条件
  7. Vue学习之--------Vue中收集表单数据(使用v-model 实现双向数据绑定、代码实现)(2022/7/18)
  8. 5.pygame快速入门-精灵和精灵组
  9. 变量的复制&传递
  10. FileNotFoundError: Could not find module libmxnet.dll