本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2020-07-10 | 编程技术 | 23981 次阅读 | 等你评论 | 2 次点赞 | 繁体

新增了代理功能,不能用的话自行修改代理即可,代码如下浅显易懂

import re
import requests
from requests import RequestException
import time
import random
from bs4 import BeautifulSoup


# 获取网页的response文件
def get_response(url):
    try:
        headers = {
            'Referer': 'https://blog.csdn.net',  # 伪装成从CSDN博客搜索到的文章
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
            # 伪装成浏览器
        }
        # 设置代理ip
        porxy_list = [
            {"http": "http://218.60.8.99:3129"},
            {"http": "http://114.226.244.78:9999"},
            {"http": "http://39.137.95.71:80"},
            {"http": "http://115.159.31.195:8080"},
            {"http": "http://39.137.69.7:8080"},
            {"http": "http://39.106.66.178:80"},
            {"http": "http://101.4.136.34:81"},
            # 最新添加
            {"http": "http://1.197.10.199:9999"},
            {"http": "http://115.216.79.93:9999"},
            {"http": "http://123.149.136.215:999"},
            {"http": "http://39.108.92.182:8888"},
            {"http": "http://221.1.200.242:43399"},
            {"http": "http://175.42.123.88:9999"},
            {"http": "http://223.241.119.0:9999"},
            {"http": "http://59.44.78.30:54069"},
            {"http": "http://114.104.185.114:9999"},
            {"http": "http://163.204.247.84:9999"},
            {"http": "http://123.149.141.128:9999"},
            {"http": "http://223.215.6.181:9999"},
            {"http": "http://106.85.143.27:9999"},
            {"http": "http://123.163.27.131:9999"},
            {"http": "http://61.145.4.204:9999"},
            {"http": "http://183.166.162.198:9999"},
            {"http": "http://110.243.2.57:9999"},
        ]
        proxy = random.choice(porxy_list)
        response = requests.get(url, headers=headers, proxies=proxy)
        if response.status_code == requests.codes.ok:  # 响应状态码是200 或者Requests还附带了一个内置的状态码查询对象
            return response.text
        return None
    except RequestException:
        print('请求出错')
        return None


# 获取博客中所有的文章链接,在下面soup对象创建过程中,如果网页编码为其他应该,加一个from_encoding='UTF-8'
def get_url(html, u_name):
    url_list = []
    num = re.findall(r'<div.*?article-item-box csdn-tracking-statistics.*?data-articleid.*?(\d+).*?>', html)
    for x in range(len(num)):
        url = f'https://blog.csdn.net/{u_name}/article/details/{num[x]}'
        url_list.append(url)
    return url_list


# 查询博客有多少页(暂时没想到更好的方法,以后会完善的)
def get_page(u_name):
    var = 1
    while True:
        url = f'https://blog.csdn.net/{u_name}/article/list/{var}'
        list1 = get_url(get_response(url), u_name)
        if len(list1):
            var += 1
        else:
            break
    return var - 1


# 获取文章总阅读量
def get_all(html):
    read_num = int(re.compile(r'<dl.*?text-center.*?title.*?(\d[0-9][0-9][0-9]*).*?>').search(html).group(1))
    return read_num


def parse_page(html):
    try:
        read_num = int(re.compile('<span.*?read-count.*?(\d+).*?</span>').search(html).group(1))
        return read_num
    except Exception:
        print('解析出错')
        return None


# 获取每篇文章标题
def get_name(url):
    html = get_response(url)
    soup = BeautifulSoup(html, 'html.parser')
    return soup.title.string


# 入口
def main():
    url_old = []        # 用于存储用户每一页的文章链接
    url_new = []        # 用于存储用户的每一篇文章的链接
    var_all = 0         # var_all 用于存储每一轮新增的访问总量总和
    user_name = input("请输入你的CSDN用户名:")
    page_num = get_page(user_name)
    print(f'你的博客一共有{page_num}页')
    # 获取所有文章列表
    for num in range(page_num):
        temp = num + 1
        url_old.append(f'https://blog.csdn.net/{user_name}/article/list/{temp}')
        url_new += get_url(get_response(url_old[num]), user_name)
    art_num = len(url_new)
    print(f'你的博客目前文章数{art_num}')
    var1 = get_all(get_response(url_new[0]))        # var1 用于存储刷取前的访问总量
    print('当前总阅读量:', var1)
    while True:
        for x in range(len(url_new)):
            html = get_response(url_new[x])
            read_num = parse_page(html)
            print('当前阅读量:', read_num)
            if art_num < 40:
                sleep_time = random.randint(60, 65)
            else:
                sleep_time = 1
            print('please wait', sleep_time, 's')
            time.sleep(sleep_time)  # 设置访问频率,过于频繁的访问会触发反爬虫
            print(f'文章 {x + 1}/{art_num}:')
            print(get_name(url_new[x]), '已成功访问')
        var2 = get_all(get_response(url_new[0]))  # var2 用于存储刷取后的访问总量
        print('当前循环增加的阅读量为:', var2 - var1)
        var_all += (var2 - var1)
        print(f'程序运行期间增加的总阅读量为{var_all}')


if __name__ == '__main__':
    main()

via:http://shangdixinxi.com/detail-1283626.html

标签: python博客

猜你喜欢
Python小技巧之不用GUI,照样实现图形界面
小王平常的工作是做数据处理的,手中自然握有大量的数据,在日常工作中经常需要根据业务的需求提取相应的数据,有些需求是固定的,写好脚本之后只要定期提取数据就行了。但是,像我这么懒的人,这种工作怎么可...
python | 协程与多进程的完美结合
我们知道,协程本质上是单线程单进程,通过充分利用 IO 等待时间来实现高并发。在 IO 等待时间之外的代码,还是串行运行的。因此,如果协程非常多,多少每个协程内部的串行代码运行时间超过了 IO ...
为什么网站知道我的爬虫使用了代理?
经常有朋友问:为什么自己的爬虫明明设置了代理,但一访问网站就能被发现。我总结了几种常见的情况。实际上,网站要识别你是否使用了代理,并不一定非要什么高深的反爬虫机制,也不需要使用 AI 识别用户行...
三行代码捅穿 CloudFlare 的五秒盾
经常写爬虫的同学,肯定知道 CloudFlare 的五秒盾。当你没有使用正常的浏览器访问网站的时候,它会返回如下这段文字:Checking your browser before accessi...
loguru 简单方便的 Python 日志记录管理模块
这是个啥?在 Python 中,一般情况下我们可能直接用自带的 logging 模块来记录日志,包括我之前的时候也是一样。在使用时我们需要配置一些 Handler、Formatter 来进行一些...
[python] 免费视频床源码:语雀 HLS 解决方案
从字面上的意思去理解:就是将你储存的视频放在一个可以对外播放的地方。不少人可能都会明白,视频的下载跟上传都会走你的 VPS 上的流量,但是如果用别人家的外链呢? # Free-HLS 介绍 这
分享几个免费 IP 定位 api
在做定位的朋友,如果只是单纯的想获取地址而又不想集成高德等第三方 sdk,可以试试以下地址: ``` https://ip.seeip.org/geoip https://ip.seeip.or
(首次提交评论需审核通过才会显示,请勿重复提交)