实验室布置了一个任务是爬取学校网站综合新闻部分所有新闻的标题作者存储到数据
首先是爬虫部分
import requests
from bs4 import BeautifulSoup
import time
for i in range(32240,31000,-1): #由于学校新闻url的特殊性,我们从id32240向前进行爬取(id最开始的几个已经找不到所以从后向前),这里id可以自己设立但是可能有些没有对应新闻
url = "http://news.hitwh.edu.cn/news_detail.asp?id=" + str(i) #学校新闻页面的特殊形式url
r = requests.get(url)
time.sleep(1) #为了避免某些特殊报错特意休眠1秒
r.encoding = 'utf-8' #更改编码以防乱码情况
soup = BeautifulSoup(r.text)
title = soup.find(class_='newsTitle') #寻找标题位置
balabala = soup.find(class_='newsNav') #寻找标题下的作者,来源,录入时间的位置
s = str(balabala.string)
plist = soup.find_all('p') #定位所有的段落位置
for i in range(len(s)): #将字符串分开
if s[i:i + 2] == "作者":
a = i
if s[i:i + 2] == "来源":
b = i
if s[i:i + 2] == "浏览":
c = i
if title.string == "没有找到文章": #针对某些没有文章的id 进行处理,例如id =32142情况,私下认为可能发布过但是删除了,但录入记录仍在
continue
print("标题:" + title.string)
print(s[a:b - 1])
print(s[b:c - 1])
print("内容:")
L ="" #这里设立L是为了避免子孙节点的内容出现相同的情况
ss = "" #这里设立ss是为了尽量保存文本的段落形式,而非语句形式
for p in plist:
for descendant in p.descendants: #利用遍历子孙节点的方式将内容打印
if descendant.string == " ":
continue
if descendant.string == None:
continue
elif descendant.string == L:
continue
else:
L = descendant.string
ss = ss+str(descendant.string)
print(ss)
ss = ""
print("——————————————————神奇分割线≥▽≤——————————————————")
然后再用pymysql连接数据库,这里如果python是2.0版本使用 MYSQLdb,MySQLdb 是用于 Python 连接 MySQL 数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。python3的话建议使用pymysql,PyMySQL 是 Python 中用于连接 MySQL 服务器的一个库,它遵循 Python 数据库 API 规范 V2.0,并包含了 pure-Python MySQL 客户端库.
安装pymysql
pip install PyMysql
然后先连接数据库
def connectdb():
print('连接到mysql服务器...')
# 打开数据库连接
db = pymysql.connect("localhost","登陆用户名","数据库密码","数据库名")
print('连接上了!')
return db
接着获取游标对创建的数据库进行操作
以下是最终的代码
import requests
from bs4 import BeautifulSoup
import time
import pymysql
# 连接数据库
print('连接到mysql服务器...')
db = pymysql.connect("localhost", "sydney", "123456", "xinwen")
print('连接上了!')
# 创建数据表
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS data")
sql = """CREATE TABLE data (title VARCHAR(200), writer VARCHAR(200), source VARCHAR(200) )character set = utf8"""
cursor.execute(sql)
for i in range(32240, 31000, -1): # 由于学校新闻url的特殊性,我们从id32240向前进行爬取(id最开始的几个已经找不到所以从后向前),这里id可以自己设立但是可能有些没有对应新闻
url = "http://news.hitwh.edu.cn/news_detail.asp?id=" + str(i) # 学校新闻页面的特殊形式url
r = requests.get(url)
time.sleep(1) # 为了避免某些特殊报错特意休眠1秒
r.encoding = 'utf-8' # 更改编码以防乱码情况
soup = BeautifulSoup(r.text , "html5lib")
title = soup.find(class_='newsTitle') # 寻找标题位置
balabala = soup.find(class_='newsNav') # 寻找标题下的作者,来源,录入时间的位置
s = str(balabala.string)
plist = soup.find_all('p') # 定位所有的段落位置
for i in range(len(s)): # 将字符串分开
if s[i:i + 2] == "作者":
a = i
if s[i:i + 2] == "来源":
b = i
if s[i:i + 2] == "浏览":
c = i
if title.string == "没有找到文章": # 针对某些没有文章的id 进行处理,例如id =32142情况,私下认为可能发布过但是删除了,但录入记录仍在
continue
print("标题:" + title.string)
print(s[a:b - 1])
print(s[b:c - 1])
print("内容:")
L = "" # 这里设立L是为了避免子孙节点的内容出现相同的情况
ss = "" # 这里设立ss是为了尽量保存文本的段落形式,而非语句形式
for p in plist:
for descendant in p.descendants: # 利用遍历子孙节点的方式将内容打印
if descendant.string == " ":
continue
if descendant.string == None:
continue
elif descendant.string == L:
continue
else:
L = descendant.string
ss = ss + str(descendant.string)
print(ss)
ss = ""
sql = "INSERT INTO data(title,writer,source)VALUES ('%s', '%s', '%s')" % (title.string , s[a:b - 1] , s[b:c - 1])
cursor.execute(sql)
db.commit()
print('爬取数据并插入mysql数据库完成...')
print("——————————————————≥ ▽ ≤——————————————————")