首页 > 编程语言 >Python爬虫实战之提高CSDN访问量

Python爬虫实战之提高CSDN访问量

时间:2023-07-23 23:11:06浏览次数:36  
标签:Python self 代理 blog CSDN 访问量 proxies proxy

python爬虫之建立代理池(一)_CodingInCV的博客-CSDN博客
python爬虫之建立代理池(二)_CodingInCV的博客-CSDN博客

前面2篇分别介绍了从2个免费代理网站爬取免费代理来构建我们自己的代理池。这一篇我们从实战的角度来将我们的代理池用起来,通过代理的方式访问我们的CSDN博客(CSDN会认为是一次访问,访问量+1),从而实现访问量的增长,仅供学习爬虫使用···

获取博客文章列表和链接

获取博客列表的链接是https://blog.csdn.net/xxx/article/list/, 通过在后面添加页数,获取不同页的博客列表。
img
通过分析页面的html,我们可以知道文章都在html的“article-item-box”中,因此我们可以通过在返回的html中查找“article-item-box”来得到所有的文章链接。

html_text = requests.get(url=url, headers=type(self).headers).text

arts = []
soup = BeautifulSoup(html_text, 'html.parser')
articles = soup.findAll('div', {"class": "article-item-box"}) 
for art in articles:
	tag_a = art.find_next('a')  # 搜索a标签
	url = tag_a.attrs['href']   # 文章链接
	read_num = int((art.find_next('span', {'class': 'read-num'}).text))  # 文章阅读数量
	title = tag_a.text.replace('\n', '')  # 文章标题
   
	arts.append({
		'title': title,
		'url': url,
		'read_num': read_num
	})

通过代理访问CSDN文章

proxy = self.local_proxy.get_one_proxy()
blog = self.csdn_blog.get_one_blog()
blog_url = blog['url']
headers = {
	'User-Agent': self._refresh_headers()
}
proxies = {
	k:v for k, v in proxy.items() if k !="unusable_cnt"
}
r = requests.get(blog_url, headers=headers, proxies=proxies, timeout=5)
if r.status_code != 200:
	raise Exception('status_code is not 200')

通过设置requests接口的proxies参数,即可以代理的方式访问CSDN的博客。为了更像一个真正的浏览器,我们还要经常切换User-Agent,也就是浏览器的头。

进阶

User-Agent

The Latest and Most Common User Agents List (Updated Weekly)
我们可以从这个网站下载User-Agent列表,每次访问时从中随机一个。

代理池管理

前面只是从代理网站爬取了代理,为了有效管理,我们可以在这些代理基础上,进一步开发代理池的持久化功能,比如当有代理增加或者删除时,立即保存到本地;也可以将代理保存到redis, 实时更新,要获取代理时,也从redis中获取。简单起见,这里以保存到本地json为例:

class ProxyPool:

    lock = Lock()

    def __init__(self):

        self.proxy_file = "proxy.json"

        self.proxies = {}

        self.load_proxies()

    def _dump_proxies(self):

        with self.lock:

            with open(self.proxy_file, "w") as f:

                json.dump(self.proxies, f)

  

    def load_proxies(self):

        if not os.path.exists(self.proxy_file):

            return

        with open(self.proxy_file, "r") as f:

            self.proxies = json.load(f)

    def set_proxies(self, proxies):

        self.proxies.update(proxies)

        self._dump_proxies()

    def get_one_proxy(self):

        if len(self.proxies) == 0:

            return None

        proxy = random.choice(list(self.proxies.keys()))

        return json.loads(proxy)

    def get_unusable_cnt(self, proxy):

        proxy = json.dumps(proxy)

        if proxy not in self.proxies:

            return 0

        return self.proxies[proxy]

    def remove_proxy(self, proxy):

        proxy = json.dumps(proxy)

        if proxy not in self.proxies:

            return

        self.proxies.pop(proxy)

        self._dump_proxies()

    def update_proxy_unusable_cnt(self, proxy, cnt=0):

        proxy = json.dumps(proxy)

        if proxy not in self.proxies:

            return

        self.proxies[proxy] = cnt

        self._dump_proxies()

定时爬取最新的代理和文章列表

可以借助apscheduler建立2个定时任务,免去自己手动实现定时任务:

from apscheduler.schedulers.blocking import BlockingScheduler
self.scheduler = BlockingScheduler()    
self.scheduler.add_job(self._refresh_proxy_and_blog, 'interval', hours=24, next_run_time=datetime.now())
self.scheduler.add_job(self.read_jobs, 'interval', hours=24,next_run_time=datetime.now())

完整代码:

面包多:https://mbd.pub/o/bread/ZJuam5lx

标签:Python,self,代理,blog,CSDN,访问量,proxies,proxy
From: https://www.cnblogs.com/haoliuhust/p/17576155.html

相关文章

  • Python入门 - 路径,文件夹
    路径#分隔符print(os.pathsep)#;print(os.altsep)#/print(os.extsep)#.#拼接print(os.path.join("a","b","c"))#a\b\c#绝对路径print(os.path.abspath("a/b/c"))#C:\Users\win\PycharmProjects\myTest\a\b\c......
  • Python入门 - 位运算
     a=0b1101b=0b1010print(a,b)#1310#与print(bin(a&b))#0b1000#或print(bin(a|b))#0b1111#异或print(bin(a^b))#0b0111,位不同的为1,相同的为0#非print(bin(~a))#-0b1110,-(a+1)#左移print(bin(a<<1))#0b11010#右移prin......
  • Python【12】 字典的get()方法
    返回指定键的值。参考:https://www.runoob.com/python/att-dictionary-get.html......
  • 解决python解析Excel文件报错xlrd.biffh.XLRDError: Excel xlsx file; not supported
    报错如下:解决方案:1、安装低版本xlrdpipinstallxlrd==1.2.02、Excel另存为的时候将后缀改为.xls文件再修改代码的文件后缀即可,高版本的xlrd模块依旧支持读取.xls文件参考文章:https://blog.csdn.net/yuan2019035055/article/details/128408178......
  • Python【13】 字典的 items( ) 方法
    类似于字典转元组的效果,但又不完全是参考:https://www.runoob.com/python3/python3-att-dictionary-items.html......
  • 相关系数 python 分类
    相关系数的Python分类引言本文将向刚入行的小白开发者介绍如何使用Python计算相关系数。相关系数是用于衡量两个变量之间关联程度的统计量。在数据分析和机器学习中,相关系数经常被用于探索和理解变量之间的关系。在本文中,我将向你介绍整个计算相关系数的流程,并提供每个步骤所需......
  • 显示前100个回文素数python
    回文素数的科普1.什么是回文数?回文数是指从左到右和从右到左读起来都一样的数。比如,121、12321等都是回文数。2.什么是素数?素数是指大于1且只能被1和自身整除的数。比如,2、3、5、7等都是素数。3.什么是回文素数?回文素数是同时满足回文数和素数的数。比如,131、373等都是回......
  • 显示python字典key
    如何显示Python字典的key作为一名经验丰富的开发者,我将向你解释如何在Python中显示字典的键。以下是整个过程的步骤概述:步骤描述步骤1创建一个包含键值对的字典步骤2使用keys()方法获取字典的键步骤3遍历键并显示现在让我们一步步地来实现。步骤1:创建一......
  • 无角正方形的绘制用python
    无角正方形的绘制用Python引言无角正方形是一种特殊的几何形状,它没有任何角度,所有的边长都相等。在计算机图形学中,我们可以使用Python来绘制无角正方形。本文将介绍如何使用Python的turtle模块来绘制无角正方形,以及一些有关无角正方形的背景知识。背景知识在绘制无角正方形之前......
  • 维特比算法最短路径python
    维特比算法及其在最短路径问题中的应用引言在计算机科学领域,维特比算法(Viterbialgorithm)是一种常用的动态规划算法,用于寻找最有可能的状态序列。维特比算法最初由安德鲁·维特比(AndrewViterbi)在1967年提出,用于解码卷积码信号。后来,维特比算法在自然语言处理、语音识别、机器翻......