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基础教程之基本内置数据类型介绍
Feb 20 Python
在Python中使用M2Crypto模块实现AES加密的教程
Apr 08 Python
Python检测生僻字的实现方法
Oct 23 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
自学python的建议和周期预算
Jan 30 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
python调用支付宝支付接口流程
Aug 15 Python
基于django传递数据到后端的例子
Aug 16 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
python保存log日志,实现用log日志画图
Dec 24 Python
python3 配置logging日志类的操作
Apr 08 Python
python中os包的用法
Jun 01 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无限极分类实现的两种解决方法
2013/04/28 PHP
ThinkPHP缓存方法S()概述
2014/06/13 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
Convert Seconds To Hours
2007/06/16 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
JavaScript人脸识别技术及脸部识别JavaScript类库Tracking.js
2015/09/14 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
angularjs数组判断是否含有某个元素的实例
2018/02/27 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
深入了解Django中间件及其方法
2019/07/26 Python
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
体育运动口号
2014/06/09 职场文书
爱心捐书倡议书
2015/04/27 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
人民币符号
2022/02/17 杂记