python定向爬虫校园论坛帖子信息


Posted in Python onJuly 23, 2018

引言

写这个小爬虫主要是为了爬校园论坛上的实习信息,主要采用了Requests库

源码

URLs.py

主要功能是根据一个初始url(包含page页面参数)来获得page页面从当前页面数到pageNum的url列表

import re

def getURLs(url, attr, pageNum=1):
  all_links = []
  try:
    now_page_number = int(re.search(attr+'=(\d+)', url, re.S).group(1))
    for i in range(now_page_number, pageNum + 1):
      new_url = re.sub(attr+'=\d+', attr+'=%s' % i, url, re.S)
      all_links.append(new_url)
    return all_links
  except TypeError:
    print "arguments TypeError:attr should be string."

uni_2_native.py

由于论坛上爬取得到的网页上的中文都是unicode编码的形式,文本格式都为 &#XXXX;的形式,所以在爬得网站内容后还需要对其进行转换

import sys
import re
reload(sys)
sys.setdefaultencoding('utf-8')

def get_native(raw):
  tostring = raw
  while True:
    obj = re.search('&#(.*?);', tostring, flags=re.S)
    if obj is None:
      break
    else:
      raw, code = obj.group(0), obj.group(1)
      tostring = re.sub(raw, unichr(int(code)), tostring)
  return tostring

存入SQLite数据库:saveInfo.py

# -*- coding: utf-8 -*-

import MySQLdb


class saveSqlite():
  def __init__(self):
    self.infoList = []

  def saveSingle(self, author=None, title=None, date=None, url=None,reply=0, view=0):
    if author is None or title is None or date is None or url is None:
      print "No info saved!"
    else:
      singleDict = {}
      singleDict['author'] = author
      singleDict['title'] = title
      singleDict['date'] = date
      singleDict['url'] = url
      singleDict['reply'] = reply
      singleDict['view'] = view
      self.infoList.append(singleDict)

  def toMySQL(self):
    conn = MySQLdb.connect(host='localhost', user='root', passwd='', port=3306, db='db_name', charset='utf8')
    cursor = conn.cursor()
    # sql = "select * from info"
    # n = cursor.execute(sql)
    # for row in cursor.fetchall():
    #   for r in row:
    #     print r
    #   print '\n'
    sql = "delete from info"
    cursor.execute(sql)
    conn.commit()

    sql = "insert into info(title,author,url,date,reply,view) values (%s,%s,%s,%s,%s,%s)"
    params = []
    for each in self.infoList:
      params.append((each['title'], each['author'], each['url'], each['date'], each['reply'], each['view']))
    cursor.executemany(sql, params)

    conn.commit()
    cursor.close()
    conn.close()


  def show(self):
    for each in self.infoList:
      print "author: "+each['author']
      print "title: "+each['title']
      print "date: "+each['date']
      print "url: "+each['url']
      print "reply: "+str(each['reply'])
      print "view: "+str(each['view'])
      print '\n'

if __name__ == '__main__':
  save = saveSqlite()
  save.saveSingle('网','aaa','2008-10-10 10:10:10','www.baidu.com',1,1)
  # save.show()
  save.toMySQL()

主要爬虫代码

import requests
from lxml import etree
from cc98 import uni_2_native, URLs, saveInfo

# 根据自己所需要爬的网站,伪造一个header
headers ={
  'Accept': '',
  'Accept-Encoding': '',
  'Accept-Language': '',
  'Connection': '',
  'Cookie': '',
  'Host': '',
  'Referer': '',
  'Upgrade-Insecure-Requests': '',
  'User-Agent': ''
}
url = 'http://www.cc98.org/list.asp?boardid=459&page=1&action='
cc98 = 'http://www.cc98.org/'

print "get infomation from cc98..."

urls = URLs.getURLs(url, "page", 50)
savetools = saveInfo.saveSqlite()

for url in urls:
  r = requests.get(url, headers=headers)
  html = uni_2_native.get_native(r.text)

  selector = etree.HTML(html)
  content_tr_list = selector.xpath('//form/table[@class="tableborder1 list-topic-table"]/tbody/tr')

  for each in content_tr_list:
    href = each.xpath('./td[2]/a/@href')
    if len(href) == 0:
      continue
    else:
      # print len(href)
      # not very well using for, though just one element in list
      # but I don't know why I cannot get the data by index
      for each_href in href:
        link = cc98 + each_href
      title_author_time = each.xpath('./td[2]/a/@title')

      # print len(title_author_time)
      for info in title_author_time:
        info_split = info.split('\n')
        title = info_split[0][1:len(info_split[0])-1]
        author = info_split[1][3:]
        date = info_split[2][3:]

      hot = each.xpath('./td[4]/text()')
      # print len(hot)
      for hot_num in hot:
        reply_view = hot_num.strip().split('/')
        reply, view = reply_view[0], reply_view[1]
      savetools.saveSingle(author=author, title=title, date=date, url=link, reply=reply, view=view)

print "All got! Now saving to Database..."
# savetools.show()
savetools.toMySQL()
print "ALL CLEAR! Have Fun!"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中set与frozenset方法和区别详解
May 23 Python
python之Socket网络编程详解
Sep 29 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
python常用函数与用法示例
Jul 02 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
Feb 11 Python
pytorch 模型的train模式与eval模式实例
Feb 20 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
Django自带的用户验证系统实现
Dec 18 Python
Django中session进行权限管理的使用
Jul 09 Python
python实现图片批量压缩程序
Jul 23 #Python
python中的插值 scipy-interp的实现代码
Jul 23 #Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 #Python
python中的turtle库函数简单使用教程
Jul 23 #Python
Flask框架配置与调试操作示例
Jul 23 #Python
python实现时间o(1)的最小栈的实例代码
Jul 23 #Python
Flask框架Flask-Principal基本用法实例分析
Jul 23 #Python
You might like
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
golang与PHP输出excel示例
2016/07/22 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
js清除浏览器缓存的几种方法
2017/03/15 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
原生js实现自定义难度的扫雷游戏
2021/01/22 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python实现超市商品销售管理系统
2019/10/25 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
python实现发送邮件
2021/03/02 Python
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
Linux开机引导的步骤是什么
2014/02/26 面试题
什么是规则表达式
2012/05/03 面试题
知识竞赛拉拉队口号
2014/06/16 职场文书