Python 爬虫实现增加播客访问量的方法实现


Posted in Python onOctober 31, 2019

一、序言:

世界 1024 程序猿节日不加班,闲着没事儿。。。随手写了个播客访问量爬虫玩玩,访问量过万不是事儿!!!每个步骤注释都很清晰,代码仅供学习参考!

---- Nick.Peng

二、所需环境:

Python3.x
相关模块: requests、json、lxml、urllib、bs4、fake_useragent

三、增加Blog访问量代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: Nick
# @Date:  2019-10-24 15:40:58
# @Last Modified by:  Nick
# @Last Modified time: 2019-10-24 16:54:31
import random
import re
import time
import urllib
import requests

from bs4 import BeautifulSoup
from fake_useragent import UserAgent

try:
  from lxml import etree
except Exception as e:
  import lxml.html
  # 实例化一个etree对象(解决通过from lxml import etree导包失败)
  etree = lxml.html.etree

# 实例化UserAgent对象,用于产生随机UserAgent
ua = UserAgent()


class BlogSpider(object):
  """
  Increase the number of CSDN blog visits.
  """

  def __init__(self):
    self.url = "https://blog.csdn.net/PY0312/article/list/{}"
    self.headers = {
      "Referer": "https://blog.csdn.net/PY0312/",
      "User-Agent": ua.random
    }
    self.firefoxHead = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
    self.IPRegular = r"(([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5]).){3}([1-9]?\d|1\d{2}|2[0-4]\d|25[0-5])"

  def send_request(self, num):
    """
    模拟浏览器发起请求
    :param num: num
    :return: html_str
    """
    html_str = requests.get(self.url.format(
      num), headers=self.headers).content.decode()
    # print(html_str)

    return html_str

  def parse_data(self, html_str):
    """
    用于解析发起请求返回的数据
    :param html_str:
    :return: each_page_urls
    """
    # 将返回的 html字符串 转换为 element对象,用于xpath操作
    element_obj = etree.HTML(html_str)
    # print(element_obj)

    # 获取每一页所有blog的url
    each_page_urls = element_obj.xpath(
      '//*[@id="mainBox"]/main/div[2]/div/h4/a/@href')
    # print(each_page_urls)

    return each_page_urls

  def parseIPList(self, url="http://www.xicidaili.com/"):
    """
    爬取最新代理ip,来源:西刺代理
    注意:西刺代理容易被封,如遇到IP被封情况,采用以下两种方法即可解决:
    方法一:请参考我上一篇博客《Python 实现快代理IP爬虫》 ===> 喜欢研究的同学,可参考对接此接口
    方法二:直接屏蔽掉此接口,不使用代理也能正常使用
    :param url: "http://www.xicidaili.com/"
    :return: 代理IP列表ips
    """
    ips = []
    request = urllib.request.Request(url, headers=self.firefoxHead)
    response = urllib.request.urlopen(request)
    soup = BeautifulSoup(response, "lxml")
    tds = soup.find_all("td")
    for td in tds:
      string = str(td.string)
      if re.search(self.IPRegular, string):
        ips.append(string)
    # print(ips)
    return ips

  def main(self, total_page, loop_times, each_num):
    """
    调度方法
    :param total_page: 设置博客总页数
    :param loop_times: 设置循环次数
    :param each_num: 设置每一页要随机挑选文章数
    :return:
    """
    i = 0
    # 根据设置次数,打开循环
    while i < loop_times:
      # 遍历,得到每一页的页码
      for j in range(total_page):
        # 拼接每一页的url,并模拟发送请求, 返回响应数据
        html_str = self.send_request(j + 1)

        # 解析响应数据,得到每一页所有博文的url
        each_page_urls = self.parse_data(html_str)

        # 调用parseIPList随机产生代理IP,防反爬
        # ips = self.parseIPList()
        # proxies = {"http": "{}:8080".format(
        #   ips[random.randint(0, 40)])}

        # 遍历,每一页随机挑选each_num篇文章
        for x in range(each_num):
          # 随机抽取每一页的一篇博文进行访问,防反爬
          current_url = random.choice(each_page_urls)
          status = True if requests.get(
            current_url, headers=self.headers).content.decode() else False
          print("当前正在访问的文章是:{},访问状态:{}".format(current_url, status))
          time.sleep(1)  # 延时1秒,防反爬
        time.sleep(1)  # 延时1秒,防反爬
      i += 1


if __name__ == '__main__':
  bs = BlogSpider()
  bs.main(7, 200, 3) # 参数参照main方法说明,酌情设置

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 元类使用说明
Dec 18 Python
详细解析Python中的变量的数据类型
May 13 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
python实现多线程的方式及多条命令并发执行
Jun 07 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
Python使用pylab库实现绘制直方图功能示例
Jun 01 Python
基于windows下pip安装python模块时报错总结
Jun 12 Python
PyQt5实现简单数据标注工具
Mar 18 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
python实现二分类的卡方分箱示例
Nov 22 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
python空元组在all中返回结果详解
Dec 15 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 #Python
如何关掉pycharm中的python console(图解)
Oct 31 #Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 #Python
python实现根据文件格式分类
Oct 31 #Python
Python简易计算器制作方法代码详解
Oct 31 #Python
python3 pillow模块实现简单验证码
Oct 31 #Python
利用Python校准本地时间的方法教程
Oct 31 #Python
You might like
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
javascript 面向对象继承
2009/11/26 Javascript
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
python 不同方式读取文件速度不同的实例
2018/11/09 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
Python基于wordcloud及jieba实现中国地图词云图
2020/06/09 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
中科方德软件测试面试题
2016/04/21 面试题
大学生关于奋斗的演讲稿
2014/01/09 职场文书
测控技术自荐信
2014/06/05 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
安全生产协议书
2016/03/22 职场文书
浅谈mysql返回Boolean类型的几种情况
2021/06/04 MySQL
java executor包参数处理功能 
2022/02/15 Java/Android
一文搞懂MySQL索引页结构
2022/02/28 MySQL