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 自动化将markdown文件转成html文件的方法
Sep 23 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
Jun 01 Python
Python判断中文字符串是否相等的实例
Jul 06 Python
Python实现登陆文件验证方法
Oct 06 Python
Python微医挂号网医生数据抓取
Jan 24 Python
python如何读取bin文件并下发串口
Jul 05 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
python数字类型和占位符详情
Mar 13 Python
Python matplotlib多个子图绘制整合
Apr 13 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 zend 相对路径问题
2009/01/12 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
php分页代码学习示例分享
2014/02/20 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
2011/04/08 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
浅谈JS原型对象和原型链
2016/03/02 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
Angularjs修改密码的实例代码
2017/05/26 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
微信小程序下拉加载和上拉刷新两种实现方法详解
2019/09/05 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
vue打开子组件弹窗都刷新功能的实现
2020/09/21 Javascript
18个Python脚本可加速你的编码速度(提示和技巧)
2019/10/17 Python
python实现滑雪游戏
2020/02/22 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
python文件路径操作方法总结
2020/12/21 Python
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
表扬稿范文
2015/01/17 职场文书
财务人员岗位职责
2015/02/03 职场文书
德劲DE1105机评
2022/04/05 无线电
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技