前言
我之前写了下载单篇文章的接口函数,结合这篇写的,就可以下载所有个人的所有文章了
代码实现
- 没什么技术含量就是简单的xpath处理,不过有意思的是有一位csdn员工将自己的博客地址写到源码里面了,是一个隐藏的div, 不过在代码中我已经给过滤掉了。
- 优化了响应时长,毕竟需要分页爬去,如果不用多线程响应时间必然会随着文章分页的增多而增多。
- 传递了一个列表给各个的线程,多线程共用一个列表,但是我没给列表访问的时候加锁,我认为没有删除列表中的元素的情况下,列表中的数据不会损失的,只不过添加顺序是变化的(如果这条想法不对,请评论大神一定要给我解答一下),最后根据更新文章时间重新对各个文章进行排序(捞干的就是一个列表中包含多个字典,要求根据字典指定的键值进行字典的排序),用到了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 =
main(url)
作者:Hello_wshuo