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 相关文章推荐
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
Apr 18 Python
python最长回文串算法
Jun 04 Python
解决Pycharm运行时找不到文件的问题
Oct 29 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
Jan 25 Python
Python实现屏幕录制功能的代码
Mar 02 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 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
为什么《星际争霸》是测试人工智能的理想战场
2019/12/03 星际争霸
php 购物车的例子
2009/05/04 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
Jquery跨域获得Json时invalid label错误的解决办法
2011/01/11 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
Javascript实现购物车功能的详细代码
2018/05/08 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
使用Python的turtle模块画国旗
2019/09/24 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
武汉英思工程科技有限公司–ORACLE面试测试题目
2012/04/30 面试题
管理心得体会
2013/12/28 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
酒后驾车标语
2014/06/30 职场文书
员工工作自我评价
2014/09/26 职场文书
汽车车尾标语大全
2015/08/11 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
mysql 获取相邻数据项
2022/05/11 MySQL