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解析模块(ConfigParser)使用方法
Dec 10 Python
python益智游戏计算汉诺塔问题示例
Mar 05 Python
Python文件及目录操作实例详解
Jun 04 Python
Python导出DBF文件到Excel的方法
Jul 25 Python
全面理解Python中self的用法
Jun 04 Python
python3写爬取B站视频弹幕功能
Dec 22 Python
Python双向循环链表实现方法分析
Jul 30 Python
django+mysql的使用示例
Nov 23 Python
在python中利用KNN实现对iris进行分类的方法
Dec 11 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
python小程序之飘落的银杏
Apr 17 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
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHP网站开发中常用的8个小技巧
2015/02/13 PHP
php基于openssl的rsa加密解密示例
2016/07/11 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
详解VUE中v-bind的基本用法
2017/07/13 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
python单链表实现代码实例
2013/11/21 Python
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
git进行版本控制心得详谈
2017/12/10 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python装饰器的特性原理详解
2019/12/25 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
工作人员思想汇报
2014/01/09 职场文书
安全检查验收制度
2014/01/12 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
我的长生果教学反思
2014/04/28 职场文书
驾驶员培训方案
2014/05/01 职场文书
学习型班组申报材料
2014/05/31 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
大学军训通讯稿
2015/07/18 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL