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 多进程通信模块的简单实现
Feb 20 Python
python基于queue和threading实现多线程下载实例
Oct 08 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
python常见排序算法基础教程
Apr 13 Python
python2 与python3的print区别小结
Jan 16 Python
python装饰器深入学习
Apr 06 Python
python交换两个变量的值方法
Jan 12 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
解决python文件双击运行秒退的问题
Jun 24 Python
python实现动态数组的示例代码
Jul 15 Python
python入门之基础语法学习笔记
Feb 08 Python
Django之choices选项和富文本编辑器的使用详解
Apr 01 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中文字符截取防乱码
2008/03/28 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
2015/12/19 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
基于Require.js使用方法(总结)
2017/10/26 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python实现超简单端口转发的方法
2015/03/13 Python
Python3最长回文子串算法示例
2019/03/04 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
《小小竹排画中游》教学反思
2014/02/26 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
伊琍体标语
2014/06/25 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
重温入党誓词主持词
2015/06/29 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
德劲DE1108畅想
2021/04/22 无线电
python学习之panda数据分析核心支持库
2021/05/07 Python
如何理解PHP核心特性命名空间
2021/05/28 PHP
SQL实现LeetCode(177.第N高薪水)
2021/08/04 MySQL