python定向爬虫校园论坛帖子信息
作者:lannooooooooooo 发布时间:2022-02-18 19:46:29
标签:python,爬虫,论坛
引言
写这个小爬虫主要是为了爬校园论坛上的实习信息,主要采用了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!"
来源:https://blog.csdn.net/qq_22187919/article/details/60466283


猜你喜欢
- <SCRIPT language=vbscript event=BeforeInitialBind(i
- 一、view实现计数在apiviews.py中加入以下内容from ApiTest.models import ApiTestfrom dj
- curl 和 Python requests 都是发送 HTTP 请求的强大工具。 虽然 curl 是一种命令行工具,可让您直接从终端发送请
- 之前使用beego的http库的时候,有的情况需要下载文件。beego是能实现,但就是有点问题:不支持回调,没法显示下载速度,这在日常开发中
- 前言之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整
- 前不久有个正要毕业的网友给我发邮件,他毕业设计需要实现锁屏的效果,但是他没有能看懂我之前发布的对话框源码,他问能不能把锁屏相关代码说明下,我
- 简介pandas中的DF数据类型可以像数据库表格一样进行groupby操作。通常来说groupby操作可以分为三部分:分割数据,应用变换和和
- Python解释器的相关配置,供大家参考,具体内容如下1、准备工作(1)Pycharm版本为3.4或者更高。(2)电脑上至少已经安装了一个P
- 1,概念及原理:膨胀(Dilating) (或)(1)将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积。(2)内核 B 有
- 现在用MSSQL的地方太多了,有很多做技术的个人电脑上也安装SQL专业版,因为它用的多,但用的人都知道,SQL有个超级用户sa,此用户默认情
- 菜鸟笔记首先读取的txt文件如下:AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90AAAAF1
- 题目描述利用opencv或其他工具编写程序实现医学处理。实现过程# -*- coding: utf-8 -*-'''
- 本文实例讲述了vue实现引入本地json的方法。分享给大家供大家参考,具体如下:当前需要使用的组件:import data from
- 前言:网上找的地铁线路图大多数都不太清晰,而且有水印,对本人这种视力不好的人来说看起来是真的不方便。所以能不能制作属于自己的地铁线路图呢?好
- 前言ImageNet 是一个著名的公共图像数据库,用于训练对象分类、检测和分割等任务的模型,它包含超过 1400 万张图像。在 Python
- SQL 中的运算符 1算术运算符:+:加运算,求两个数或表达式想加的和-:减运算,求两个数或表达式相减的差*,乘运算,求两个数或表
- 本文实例讲述了Python正则表达式分组概念与用法。分享给大家供大家参考,具体如下:正则表达式分组分组就是用一对圆括号“()”括起来的正则表
- 本文实例为大家分享了python使用Matplotlib绘制分段函数的具体代码,供大家参考,具体内容如下环境Python3Mac OS代码#
- 如何让用户也能修改密码? 好了,照下面添加到你要添加的地方去:<%id = Request(&qu
- 前言最近有朋友在做投票的项目,里面有用到一个倒计时的组件,还想要个动画效果。cv * 浸染多年的我,首先想到的是直接找个现有的组件。通过一通搜