我每天打开电脑,前五件事就是看csdn访问量,一直期待访问量突破100W,可能那是个梦吧
但是也不能放弃!
需要用到的库
我看到许多爬虫教程都是用的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属性可以得到网页的源码,字符串类型,这样以后我们就能通过各种字符串操作方便地解析网页,从而获取我们想要的信息。
其实解析网页最直接的办法是利用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?
