python3爬取CSDN个人所有文章列表页

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chouzhou9701/article/details/89786846

前言

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

代码实现

  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)

猜你喜欢

转载自blog.csdn.net/chouzhou9701/article/details/89786846