python小脚本 查询csdn博客访问量、粉丝以及喜欢 (2019.10.13更新----2019.10.25再次更新)

我每天打开电脑,前五件事就是看csdn访问量,一直期待访问量突破100W,可能那是个梦吧

但是也不能放弃!

需要用到的库

pyquery、requests

 

主要技术点

Requests库获取网页

我看到许多爬虫教程都是用的urllib2等比较过时的爬虫库来获取网页信息,一来python2马上停止支持,python2时代的urllib2的凸现出来的毛病会越来越多且无法得到官方的修复;二来无论是基于python2的ulilib2还是python3的urllib3,过程都稍显繁琐,不如requests库简明,而且urllib2/3能做的requests都能做,干嘛不用requests呢?

requests.get(url=myUrl,headers=headers).text

get()接收两个关键字参数,第一个就是我们要爬取网页的URL,第二个就是请求头,用于模拟浏览器访问服务器,不然csdn的服务器会拒绝连接,不懂的可以百度补一下计算机网络相关知识。

get()返回的是一个requests.models.Response对象,通过它的text属性可以得到网页的源码,字符串类型,这样以后我们就能通过各种字符串操作方便地解析网页,从而获取我们想要的信息。

pyqeury库解析网页

其实解析网页最直接的办法是利用re这个库写正则表达式提取信息,优点是正则是万能的,所有的字符串提取都可以通过字符串提取,只有改变匹配的规则就行了,不过缺点是学习起来费劲(最好还是要掌握的,毕竟每个语言的匹配规则都是类似的,在java学的匹配规则照样可以用在python中,只是语法不同,API稍有差异)

第三方解析库有BeautifulSoup、lxml、pyquery等,学习这些库前最好已经掌握css选择器的一些语法规则,再学这些解析库就事半功倍了,个人感觉最好用的是pyquery库。安装pyquery需要在在命令行下输入:

pip install pyquery

拿到网页源码后,通过

doc = pq(myPage)

得到一个pyquery.pyquery.PyQuery对象,其中参数就是网页源码

然后可以通过

doc(“aside .data-info dl”).items()

来得到aside标签下class为data-info的标签下的所有dl标签,返回的仍是一个pyquery.pyquery.PyQuery对象,如果dl的标签不止一个,我们可以通过.items()把这个对象转乘一个生成器,通过for a in b来迭代获取每一个dl标签,同样地,迭代出来的每一个子项还是pyquery.pyquery.PyQuery对象。

下面是pyquery常见的api

名称功能
attr(key)得到标签下属性key的属性值,字符串类型
parent()/children()得到标签的父/子标签
text()得到标签的文本

更多的api可以参考:pyqeury官方教程

另外的,假设一个pyquery.pyquery.PyQuery对象a,通过a(“li”),可以对a里的li标签再选择,所以这种选择过程可以是多重嵌套的,一个容易忘记的选择器语法是a("[b=c]"),用来选择a标签下属性b的属性值为c的所有标签。

2019.10.13更新

import time
import requests
import re
from pyquery import PyQuery as pq

# account = str(input('print csdn id:'))
# 首页地址
account = 'qq_41325698'
baseUrl = 'http://blog.csdn.net/' + account
# 连接页号,组成爬取的页面网址
myUrl = baseUrl + '/article/list/1'

headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
# 构造请求

# 访问页面
myPage = requests.get (myUrl, headers=headers).text

doc = pq (myPage)
n_fan = 0
n_like = 0
n_talk = 0
n_count = 0

data_info = doc ("aside .data-info dl").items ()
#data2=doc("aside .grade-box dd").items()
# print (time.strftime ("%Y-%m-%d %H:%M:%S", time.localtime ()))
for i, item in enumerate (data_info):
    # print(item.attr("title"))
    if i == 1:
        n_fan = item.attr ("title")
    if i == 2:
        n_like = item.attr ("title")
    if i == 3:
        n_talk = item.attr ("title")
    if i==4:
        n_count=item.attr("title")
# grade_box = doc ("aside .grade-box dd").items ()
# for i, item in enumerate (grade_box):
#     if i == 0:
#         n_count = item.attr ("title")
        # print(n_count)
# print (n_fan, n_like, n_talk, n_count)
print ('--------------------------------------------------------------------')
with open ('D:\important_move_system\csdn访问量.txt', 'r', encoding="gb18030") as f:
    l = f.readlines ()

    for i in range (0, len (l)):
        # print (l[i])
        t = 0
        t = re.findall (r'\d+', l[i])

        if i == 0:
            pre_fan = int (''.join (t))
        if i == 1:
            pre_like = int (''.join (t))
        if i == 2:
            pre_talk = int (''.join (t))
        if i == 3:
            pre_count = int (''.join (t))
add_fan = int (n_fan) - pre_fan
add_like = int (n_like) - pre_like
add_talk = int (n_talk) - pre_talk
# print(n_count)
# print(type(n_count))
add_count = int (n_count) - pre_count

print ('现在是北京时间:' + time.strftime ("%Y-%m-%d %H:%M:%S", time.localtime ()) +'新增了粉丝:' + str (add_fan) + ' 喜欢:' + str (
    add_like) + ' 讨论:' + str (add_talk) + ' 访问量:' + str (add_count))
my_str = '当前粉丝:' + n_fan + ' 当前喜欢:' + n_like + ' 当前讨论:' + n_talk + ' 当前访问量:' + n_count
print (my_str)

with open ('D:\important_move_system\csdn访问量.txt', 'w', encoding="gb18030") as f:
    f.write ('当前粉丝:' + n_fan + '\n')
    f.write ('当前喜欢:' + n_like + '\n')
    f.write ('当前讨论:' + n_talk + '\n')
    f.write ('当前访问量:' + n_count + '\n')

然后我在桌面建了个bat脚本

start cmd /K "G:&&cd G:\Python\python程序部件\shuafangwenliang&&python test002.py "

以后每次点击bat脚本就行了

也有可能遇到报错

估计是因为csdn的反爬虫机制吧

maybe :ip?or something else?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值