简介
爬取学校新闻网站文章,包括标题,作者,日期,阅读量和文章内容,并储存在MySQL
思路
我用到的是requests库,先获取网页源码,并用pyquery提取所需信息,然后用pymysql存储到数据库中。
爬取问题与解决
在提取所需信息时,包括标题,作者,时间,文章都是可以直接在网页源码中截取的,但是在提取阅读量时,却发现是通过post方法获取的。
因为我找到了
因此我打算直接post,但是在找接口的时候,却找到了这个
$.ajax(
{
type:'post',
url:'/interFace/getDocReadCount.do?id=506980',
timeout:2000,
success:function(ret)
{
$('#readcount').html($.trim(ret))},
error:function(ret)
{
$.ajax({
type:'post',
url:'/ecms_external?method=syncOfflineVisitCount',
data:'type=doc&requestUrl='+location.href,
timeout:2000,
success:function(ret){
$('#readcount').html(ret);},
error:function(){
$('#readcount').html(0);
}});}});
我直接好家伙,因为我可以通访问第三行的地址获取到阅读量。
url:’/interFace/getDocReadCount.do?id=506980’,
根据过去经验,一般可以在网页header里找到id,但是纵览整个页面,包括请求头内,只有这一行有该文章的id,所以只能直接通过提取字符串来获取。
存储问题与解决
# 保存文章信息
def __save_art(self, head, content):
key = 'title' + ', author' + ', readcount' + ', time' + ', content' # 键名称
# 值内容
value = ' \'' + head["title"] + '\', \'' + head["author"] \
+ '\', \'' + head["readCount"] + '\', \'' \
+ head["time"] + '\', \'' + content + '\''
sqlInsert = 'INSERT INTO %s(%s) values(%s)' % (self.__table_name, key, value) # 提交内容
self.__cursor.execute(sqlInsert)
大部分文章都可以正常存储,在MySQL里,但个别文章中出现了单引号之类的符号,直接导致程序终止,SQLInsert语句语法错误,因此需要转义字符串内容。我使用的是
pymysql.escape_string(text)
修改后不再报错
def __save_art(self, head, content):
key = 'title' + ', author' + ', readcount' + ', time' + ', content' # 键名称
# 值内容
value = ' \'' + pymysql.escape_string(head["title"]) + '\', \'' + pymysql.escape_string(head["author"]) \
+ '\', \'' + head["readCount"] + '\', \'' \
+ head["time"] + '\', \'' + pymysql.escape_string(content) + '\''
sqlInsert = 'INSERT INTO %s(%s) values(%s)' % (self.__table_name, key, value) # 提交内容
self.__cursor.execute(sqlInsert)
来源:oschina
链接:https://my.oschina.net/u/4353180/blog/4759990