相思资源网 Design By www.200059.com
写爬虫是一项复杂、枯噪、反复的工作,考虑的问题包括采集效率、链路异常处理、数据质量(与站点编码规范关系很大)等。整理自己写一个爬虫程序,单台服务器可以启用1~8个实例同时采集,然后将数据入库。
#-*- coding:utf-8 -*-
#!/usr/local/bin/python
import sys, time, os,string
import mechanize
import urlparse
from BeautifulSoup import BeautifulSoup
import re
import MySQLdb
import logging
import cgi
from optparse import OptionParser
#----------------------------------------------------------------------------#
# Name: TySpider.py #
# Purpose: WebSite Spider Module #
# Author: 刘天斯 #
# Email: liutiansi@gamil.com #
# Created: 2010/02/16 #
# Copyright: (c) 2010 #
#----------------------------------------------------------------------------#
"""
|--------------------------------------------------------------------------
| 定义 loging class;
|--------------------------------------------------------------------------
|
| 功能:记录系统相关日志信息。
|
|
"""
class Pubclilog():
def __init__(self):
self.logfile = 'website_log.txt'
def iniLog(self):
logger = logging.getLogger()
filehandler = logging.FileHandler(self.logfile)
streamhandler = logging.StreamHandler()
fmt = logging.Formatter('%(asctime)s, %(funcName)s, %(message)s')
logger.setLevel(logging.DEBUG)
logger.addHandler(filehandler)
logger.addHandler(streamhandler)
return [logger,filehandler]
"""
|--------------------------------------------------------------------------
| 定义 tySpider class;
|--------------------------------------------------------------------------
|
| 功能:抓取分类、标题等信息
|
|
"""
class BaseTySpider:
#初始化相关成员方法
def __init__(self,X,log_switch):
#数据库连接
self.conn = MySQLdb.connect(db='dbname',host='192.168.0.10', user='dbuser',passwd='SDFlkj934y5jsdgfjh435',charset='utf8')
#分类及标题页面Community
self.CLASS_URL = 'http://test.abc.com/aa/CommTopicsPage""
#self.bodySoup对象
self.soup=None
#发表回复页下载内容变量
self.Contentbody=""
#发表回复页内容self.ContentbodySoup对象
self.Contentsoup=None
#日志开关
self.log_switch=log_switch
#======================获取名称及分类方法==========================
def _SpiderClass(self,nextpage=None):
if nextpage==None:
FIXED_QUERY = 'cmm='+str(self.X)
else:
FIXED_QUERY = nextpage[1:]
try:
rd = mechanize.Browser()
rd.addheaders = [("User-agent", "Tianya/2010 (compatible; MSIE 6.0;Windows NT 5.1)")]
rd.open(self.CLASS_URL + FIXED_QUERY)
self.body=rd.response().read()
#rd=mechanize.Request(self.CLASS_URL + FIXED_QUERY)
#response = mechanize.urlopen(rd)
#self.body=response.read()
except Exception,e:
if self.log_switch=="on":
logapp=Pubclilog()
logger,hdlr = logapp.iniLog()
logger.info(self.CLASS_URL + FIXED_QUERY+str(e))
hdlr.flush()
logger.removeHandler(hdlr)
return
self.soup = BeautifulSoup(self.body)
NextPageObj= self.soup("a", {'class' : re.compile("fs-paging-item fs-paging-next")})
self.cursor = self.conn.cursor()
if nextpage==None:
try:
Ttag=str(self.soup.table)
#print Ttag
"""
------------------分析结构体-----------------
<table cellspacing="0" cellpadding="0">
<tr>
<td>
<h1 title="Dunhill">Dunhill</h1>
</td>
<td valign="middle">
<div class="fs-comm-cat">
<span class="fs-icons fs-icon-cat"> </span> <a href="TopByCategoryPage">中国</a> » <a href="TopByCategoryPage">人民</a>
</div>
</td>
</tr>
</table>
"""
soupTable=BeautifulSoup(Ttag)
#定位到第一个h1标签
tableh1 = soupTable("h1")
#print self.X
#print "Name:"+tableh1[0].string.strip().encode('utf-8')
#处理无类型的
try:
#定位到表格中符合规则“^TopByCategory”A链接块,tablea[0]为第一个符合条件的连接文字,tablea[1]...
tablea = soupTable("a", {'href' : re.compile("^TopByCategory")})
if tablea[0].string.strip()=="":
pass
#print "BigCLass:"+tablea[0].string.strip().encode('utf-8')
#print "SubClass:"+tablea[1].string.strip().encode('utf-8')
except Exception,e:
if self.log_switch=="on":
logapp=Pubclilog()
logger,hdlr = logapp.iniLog()
logger.info("[noClassInfo]"+str(self.X)+str(e))
hdlr.flush()
logger.removeHandler(hdlr)
self.cursor.execute("insert into baname"+str(self.mod)+" values('%d','%d','%s')" %(self.X,-1,tableh1[0].string.strip().encode('utf-8')))
self.conn.commit()
self._SpiderTitle()
if NextPageObj:
NextPageURL=NextPageObj[0]['href']
self._SpiderClass(NextPageURL)
return
else:
return
#获取链接二对象的href值
classlink=tablea[1]['href']
par_dict=cgi.parse_qs(urlparse.urlparse(classlink).query)
#print "CID:"+par_dict["cid"][0]
#print "SubCID:"+par_dict["subcid"][0]
#print "---------------------------------------"
#插入数据库
self.cursor.execute("insert into class values('%d','%s')" %(int(par_dict["cid"][0]),tablea[0].string.strip().encode('utf-8')))
self.cursor.execute("insert into subclass values('%d','%d','%s')" %(int(par_dict["subcid"][0]),int(par_dict["cid"][0]),tablea[1].string.strip().encode('utf-8')))
self.cursor.execute("insert into baname"+str(self.mod)+" values('%d','%d','%s')" %(self.X,int(par_dict["subcid"][0]),tableh1[0].string.strip().encode('utf-8')))
self.conn.commit()
self._SpiderTitle()
if NextPageObj:
NextPageURL=NextPageObj[0]['href']
self._SpiderClass(NextPageURL)
self.body=None
self.soup=None
Ttag=None
soupTable=None
table=None
table1=None
classlink=None
par_dict=None
except Exception,e:
if self.log_switch=="on":
logapp=Pubclilog()
logger,hdlr = logapp.iniLog()
logger.info("[ClassInfo]"+str(self.X)+str(e))
hdlr.flush()
logger.removeHandler(hdlr)
else:
self._SpiderTitle()
if NextPageObj:
NextPageURL=NextPageObj[0]['href']
self._SpiderClass(NextPageURL)
#====================获取标题方法=========================
def _SpiderTitle(self):
#查找标题表格对象(table)
soupTitleTable=self.soup("table", {'class' : "fs-topic-list"})
#查找标题行对象(tr)
TitleTr = soupTitleTable[0]("tr", {'onmouseover' : re.compile("^this\.className='fs-row-hover'")})
"""
-----------分析结构体--------------
<tr class="fs-alt-row" onmouseover="this.className='fs-row-hover'" onmouseout="this.className='fs-alt-row'">
<td valign="middle" class="fs-hot-topic-dots-ctn">
<div class="fs-hot-topic-dots" style="background-position:0 -0px" title="点击量:12"></div>
</td>
<td valign="middle" class="fs-topic-name">
<a href="CommMsgsPage" id="a53" title="【新人报到】欢迎美国人民加入" target="_blank">【新人报到】欢迎美国人民加入</a>
<span class="fs-meta">
<span class="fs-icons fs-icon-mini-reply"> </span>0
/
<span class="fs-icons fs-icon-pageview"> </span>12</span>
</td>
<td valign="middle">
<a class="fs-tiny-user-avatar umhook " href="ProfilePage" title="中国人"><img src="/UploadFiles/2021-04-08/s.jpg">
标签:
python,爬虫程序
相思资源网 Design By www.200059.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
相思资源网 Design By www.200059.com
暂无python 写的一个爬虫程序源码的评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?