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对象体系深入分析
Oct 28 Python
详解Python验证码识别
Jan 25 Python
Python numpy 常用函数总结
Dec 07 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python动态导入模块的方法实例分析
Jun 28 Python
python实现简单flappy bird
Dec 24 Python
使用python模拟高斯分布例子
Dec 09 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
Python list和str互转的实现示例
Nov 16 Python
Python包管理工具pip的15 个使用小技巧
May 17 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 输出缓存详解
2009/06/20 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
谈谈JavaScript中的几种借用方法
2016/08/09 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
jquery+css实现下拉列表功能
2017/09/03 jQuery
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
2019/02/28 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
电大本科自我鉴定
2014/02/05 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
2014年小学数学教师工作总结
2014/12/03 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android