利用Python爬取学校信息门户新闻并存入数据库

本文介绍了使用Python爬虫抓取学校信息门户新闻的完整流程,包括模拟登录、获取新闻标题和链接、解析新闻内容以及将数据存储到MySQL数据库。在登录过程中遇到登录验证码变化的问题,最终通过session保持会话解决。通过bs4和re库解析网页,利用pymysql将数据保存到数据库。总结了在爬虫开发过程中解决问题的重要性。

任务:利用Python爬虫的相关知识爬取学校信息门户并将数据存入数据库中
用到并且需要掌握的Python第三方库

import requests
from bs4 import BeautifulSoup
import re
import pymysql
import bs4

需要解决的关键问题
1.利用requests进行模拟登录,并用session保持会话。
2.利用bs4库对登录后的页面进行解析,获取网页新闻的链接。
3.利用bs4库和re库如何对新闻页面进行解析,获取新闻的内容。
4.利用bs4库爬取新闻内容,并利用pymysql库保存到数据库中。

1.模拟登陆

我一开始时利用requests中的post方法向登录界面提交数据,自信满满,认为自己能够登录成功,就写出了以下幼稚的代码。

postUrl = url
postHeader = {
    'User-Agent': User-Agent
}
data = {'username': account, 'password': password}
try:
    r = requests.post(url=postUrl, data=data, headers=postHeader)
    html = r.text
    soup = BeautifulSoup(html, 'lxml')
    print(soup.prettify())
except:
    print('爬取失败')

结果没有显示爬取失败,我以为自己成功了 ,可等我把输出的内容一看,这不就是登录界面的源码?返回了登录界面?完全没有任何网页新闻的链接,我才意识到我失败了。让我郁闷了好久,
有一天我在CSDN上看到登录时可以在headers中加入cookies,于是我又去试了下学校的信息门户。

postUrl = url
postHeader = {
    'User-Agent': User-Agent
    'Cookie': 'route=c4b118a65a48d46153e675807ba40b24; JSESSIONID_ids2=0001o4YS2gmK_LGPzJczYckMjGH:-LH1ERP'
}
data = {'username': account, 'password': password}
try:
    r = requests.post(url=postUrl, data=data, headers=postHeader)
    html = r.text
    soup = BeautifulSoup(html, 'lxml')
    print(soup.prettify())
except:
    print('爬取失败')

结果可想而知,还是登录界面的源码。又自闭了好几天,有一天看到一篇写session的文章,session是用来保持会话的啊,我这还没登上去的呢,算了,死马当作活马医,用session来post数据,看看能不能登上去,我又双叒叕把代码改了。

postUrl = url
postHeader = {
    'User-Agent': User-Agent
}
session = requests.session()
postData = {'username': account, 'password': password}
r = session.post(postUrl, headers=postHeader, data=postData)
html = r.text
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())

我又双叒叕把代码改了之后又双叒叕失败了。我自闭了,某天晚上看了学长的博客后恍然大悟,我没有注意到每次的登录校验码都不一样,每一次登陆时的时候登录效验码都不一样,应当先用session登录失败一次,获取此时的登录效验码,然后再用登录效验码和正确用户名密码登录信息门户,这下登录的问题终于解决了。

# 获取登录时的效验码
soup = BeautifulSoup(session.post(postUrl, headers=postHeader).text, 'lxml')
lt = soup.find('input', {'name': 'lt'})['value']
dllt = soup.find('input', {'name': 'dllt'})['value']
execution = soup.find('inpu
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值