curl 抓取网页(如何通过python抓取网页,见Python和python的功能很强大 )
优采云 发布时间: 2021-11-10 18:05curl 抓取网页(如何通过python抓取网页,见Python和python的功能很强大
)
之前的一篇文章文章介绍了如何通过python爬取网页,见Python爬取中文网页,但很快发现这个方法对CSDN个人博客的爬取不起作用
. 很久以前就听说过curl的威力,所以今天就来试一试。
curl的功能非常强大。这里介绍一下curl的使用。你可以参考一下。其他问题请百度和谷歌。这里我们只使用最基本的--connect-timeout和-o。以本博客为例:
curl -s --connect-timeout 10 -o blog "http://blog.csdn.net/nevasun"
OK,当前目录下就会有一个博客文件了。当我们将其作为纯文本文件打开时,我们会发现以下信息:
访问:10598次
积分:610分
排名:第13159名
接下来,我们要做的就是从博客文件中提取访问量、积分、排名等信息。前几天刚学了awk,所以用awk试试吧。awk的介绍和学习请参考AWK学习总结和练习。下面的awk相关内容可以在里面找到。
awk 程序由一系列“模式-动作”语句组成:模式 {action}。
匹配模式可以是/(visit|points|ranking):.*/,匹配模式后需要取出当前行的值。由于号码长度不固定,不能使用定长号码。您可以使用 gsub() 将非数字字符替换为空字符,其余为数字。接下来是完整的awk代码。
awk 'BEGIN {FS="[]"; ORS="\t"} /(访问|积分|排名):.*/ \
{ if($3 == "访问:") {gsub(/[^0-9]+/, ""); print} \
else if($3 == "积分:") {gsub(/[^0-9]+/, ""); print} \
else if($3 == "排名:") {gsub(/[^0-9]+/, ""); print}}' blog
至此,我们已经能够抓取到需要的数据了,通过shell和python脚本,使用cron,可以让系统定时记录每天的访问情况。
Shell 脚本 account.sh:
Python 脚本 dbroutine.py:
#!/usr/bin/python
import os
import cPickle as pcl
import sys
from time import localtime
def load_record(db_file):
recordlist = [{}]
if os.path.exists(db_file):
readf = file(db_file)
try:
recordlist = pcl.load(readf)
except:
recordlist = [{}]
readf.close()
return recordlist
def dump_record(db_file, recordlist, total_access, score, rank):
writef = file(db_file, "wb")
if recordlist[0].has_key("total_access"):
day_count = total_access-recordlist[0]["total_access"]
else:
day_count = total_access
date = "%s.%s.%s" % \
(localtime().tm_year, localtime().tm_mon, localtime().tm_mday)
day_record = dict(date=date, day_access=day_count, \
total_access=total_access, score=score, rank=rank)
recordlist.insert(0, day_record)
pcl.dump(recordlist, writef)
writef.close()
def print_record(recordlist, total_access, score, rank):
if recordlist[0].has_key("total_access"):
day_count = total_access-recordlist[0]["total_access"]
else:
day_count = total_access
date = "%s.%s.%s" % \
(localtime().tm_year, localtime().tm_mon, localtime().tm_mday)
day_record = dict(date=date, day_access=day_count, \
total_access=total_access, score=score, rank=rank)
print day_record
for i in range(0, len(recordlist)):
print recordlist[i]
db_file = "blog_record.dat"
recordlist = [{}]
if len(sys.argv) != 5:
raise Exception
total_access = int(sys.argv[1])
score = int(sys.argv[2])
rank = int(sys.argv[3])
flag = int(sys.argv[4])
recordlist = load_record(db_file)
if flag != 0:
dump_record(db_file, recordlist, total_access, score, rank)
else:
print_record(recordlist, total_access, score, rank)