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进程类subprocess的一些操作方法例子
Nov 22 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python 获取utc时间转化为本地时间的方法
Dec 31 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
postman模拟访问具有Session的post请求方法
Jul 15 Python
关于Python3 lambda函数的深入浅出
Nov 27 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
python和C++共享内存传输图像的示例
Oct 27 Python
openstack中的rpc远程调用的方法
Jul 09 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
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
PHP IDE PHPStorm配置支持友好Laravel代码提示方法
2015/05/12 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
移动手机APP手指滑动切换图片特效附源码下载
2015/11/30 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
JavaScript将base64图片转换成formData并通过AJAX提交的实现方法
2016/10/24 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
Python定时执行之Timer用法示例
2015/05/27 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
python 出现SyntaxError: non-keyword arg after keyword arg错误解决办法
2017/02/14 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
python单例模式的多种实现方法
2019/07/26 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
求职简历推荐信范文
2013/12/02 职场文书
五年级科学教学反思
2014/02/05 职场文书
七一党日活动总结
2014/07/08 职场文书
python - timeit 时间模块
2021/04/06 Python