Python爬虫实战之提高CSDN访问量
python爬虫之建立代理池(一)_CodingInCV的博客-CSDN博客
python爬虫之建立代理池(二)_CodingInCV的博客-CSDN博客
前面2篇分别介绍了从2个免费代理网站爬取免费代理来构建我们自己的代理池。这一篇我们从实战的角度来将我们的代理池用起来,通过代理的方式访问我们的CSDN博客(CSDN会认为是一次访问,访问量+1),从而实现访问量的增长,仅供学习爬虫使用···
获取博客文章列表和链接
获取博客列表的链接是https://blog.csdn.net/xxx/article/list/, 通过在后面添加页数,获取不同页的博客列表。
通过分析页面的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())
完整代码:
本文来自博客园,作者:CoderInCV,转载请注明原文链接:https://www.cnblogs.com/haoliuhust/p/17576155.html