python爬取网页公告并批量存入至mysql中

开发环境:python 2.7.6,mysql 5.5-44

#coding=utf-8
import urllib2
import urllib
import string
import re
import MySQLdb

req=urllib2.Request("http://jw.nju.edu.cn/")
response=urllib2.urlopen(req)
myPage=response.read()
#temp=myPage.decode('utf8')
#xx="<ul><li>(.*)<span class='top'>"
#pattern = re.compile(xx)  
#results =  list(pattern.findall(temp))
#for result in results :  
#  print result 


    #置顶公告
pattern=re.compile("<ul><li>(.*)<span class='top'>")
myMatch=pattern.search(myPage,re.S)
sa=myMatch.group(1)
BgnPartRex = re.compile("\'")                                                #将页面源码中 ' 匹配掉
sa=BgnPartRex.sub("",sa)
tongzhi=re.compile('title=(.*?)>')
lianjie=re.compile('FType=WZSY&(.*?)title')
title=tongzhi.findall(sa,re.S)                                                    #返回list
print type(title[0])
url=lianjie.findall(sa,re.S)
    
    #非置顶公告
pattern2=re.compile("<ul><li>(.*?)</span></li></ul>")
myMatch=pattern2.search(myPage,re.S)
sa=myMatch.group(1)
BgnPartRex = re.compile("(.*)<span class='top'>")
sa=BgnPartRex.sub("",sa)
BgnPartRex = re.compile("\'")
sa=BgnPartRex.sub("",sa)
tongzhi2=re.compile('title=(.*?)>')
lianjie2=re.compile('FType=WZSY&(.*?)title')
title2=tongzhi2.findall(sa,re.S)                                   
url2=lianjie2.findall(sa,re.S)
    
zhiding=[]
feizhiding=[]
for i in range(len(title)):
    zhiding.append((0,title[i],url[i]))
zhiding.reverse()                                                                 #逆序存放,方便后面读取时新数据在最前
for m in range(len(title2)):
   feizhiding.append((0,title2[m],url2[m]))
feizhiding.reverse()
    
conn=MySQLdb.connect(host='localhost',user='root',passwd='',db='python',charset='utf8')
cur=conn.cursor()
cur.executemany('insert into zhiding values(%s,%s,%s)',zhiding)                                 #批量存放
cur.executemany('insert into title values(%s,%s,%s)',feizhiding)
conn.commit()
cur.close()
conn.close()

在进行爬取时一定要注意观察页面源码,如在区分置顶帖和非置顶帖时,因置顶帖后面带有 [置顶],本想通过匹配[置顶]来区分置顶帖和非置顶帖,但是汉字匹配以及其他一些问题耗费了我很多时间,而后再仔细看了一下页面源码,发现置顶帖都有一个标签:<span class='top' ,这样一来就方便了许多。

cur.executemany('insert into zhiding values(%s,%s,%s)',zhiding) 
等价于

for i in range(len(zhiding))
    cur.execute('insert into zhiding values(%s,%s,%s)',zhiding[i])


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值