提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
@TOC关于爬取教务处课程表和教务处要闻的总结
前言
为学习python爬虫相关知识,对教务处下手啦
一、主要内容:request库的使用,re库的使用,xpath的使用,python基础语法。
二、
1.爬取课程表
:
import os
import prettytable
import requests
from lxml import etree
import re
2.读入数据
代码如下(示例):
def put(schedule_list, lesson_list):
for lesson in schedule_list:
lesson_list.append(lesson.xpath('./font/text()'))
def printteacher(schedule_list,teacher_list): #打印老师行
for teacher in schedule_list:
t = teacher.xpath('./text()')
if (len(t) > 0):
teacher_list.append(t[4].strip())
else:
teacher_list.append('')
scheduletable.add_row(teacher_list)
def printclassname(schdule_list,lesson_list): #打印课行
for lesson in schdule_list:
l = lesson.xpath('./font/text()')
if(len(l)>0):
for i in range(1,len(l)):
l[0] = l[0]+ '/'+l[i]
lesson_list.append(l[0].strip())
else:
lesson_list.append(' ')
scheduletable.add_row(lesson_list)
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0',
'referer': "http://jwch.fzu.edu.cn/"
}
login_url = 'http://59.77.226.32/logincheck.asp'
muser = input('请输入账号:')
passwd = input('请输入密码:')
form_data = {
'muser': muser , #muser,
'passwd':passwd #passwd
}
session = requests.session()
session.headers.update(headers)
r = session.post(url=login_url, data=form_data) # 模拟登录
baseUrl = os.path.dirname(r.url)
new_url = r.url
id = re.search(r'"(right.aspx\?id=\d+)"', r.text).group(1)
target_url = f"{baseUrl}/{id}" # 获取目标页面的url
response = session.get(url=target_url)
page_text = response.content.decode('utf-8')
ht = etree.HTML(page_text)
schedule_list1 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[11:18]
schedule_list2 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[19:26]
schedule_list3 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[27:34]
schedule_list4 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[35:42]
schedule_list5 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[44:51]
schedule_list6 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[52:59]
schedule_list7 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[60:67]
schedule_list8 = ht.xpath('//table/tr/td[@bgcolor="#FFFFFF"]')[68:75]
print("********************GODR的课程表***********************")
scheduletable = prettytable.PrettyTable()
scheduletable.field_names = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期天']
scheduletable.align = 'c'
scheduletable.padding_width = 2
lesson_list1 = []
lesson_list2 = []
lesson_list3 = []
lesson_list4 = []
lesson_list5 = []
lesson_list6 = []
lesson_list7 = []
lesson_list8 = []
teach_list1 = []
teach_list2 = []
teach_list3 = []
teach_list4 = []
teach_list5 = []
teach_list6 = []
teach_list7 = []
teach_list8 = []
printclassname(schedule_list1,lesson_list1)
printteacher(schedule_list1,teach_list1)
printclassname(schedule_list2,lesson_list2)
printteacher(schedule_list2,teach_list2)
printclassname(schedule_list3,lesson_list3)
printteacher(schedule_list3,teach_list3)
printclassname(schedule_list4,lesson_list4)
printteacher(schedule_list4,teach_list4)
printclassname(schedule_list5,lesson_list5)
printteacher(schedule_list5,teach_list5)
printclassname(schedule_list6,lesson_list6)
printteacher(schedule_list6,teach_list6)
printclassname(schedule_list7, lesson_list7)
printteacher(schedule_list7, teach_list7)
printclassname(schedule_list8, lesson_list8)
printteacher(schedule_list8, teach_list8)
print(scheduletable.get_string())
总结
其中遇到的问题:
1.模拟登陆后 新网址为 url + id=*******(id在不断变化,每次登录都不同)
网址里id值的获取
解决方案:引用os库中os.path.dirname()提取登陆后界面的url 再从中获取id
2.爬取后的课程表内容乱七八糟全在1行中
解决方案:强行切分,把每个表格的头强行xpath(xpath(’//table/tr/td[@bgcolor="#FFFFFF"]’))
然后再强行切分,再分别提取每个里面的信息,如课程,老师等(本次只爬取了课程和老师)
3.提取后如何美观的输出?
问度娘后发现了prretytable库
于是》》》》》》》》疯狂操作
但最后不知道为什么出来的效果很丑。。。
2.爬取新闻
:
import requests, re
from lxml import etree
def fetch_page_html(url): #爬取每一页的html 以便从中获取到每条新闻的链接
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0'}
r = requests.get(url=url, headers=headers)
return r.text
def get_news_url(html): #从每一面的html中获取链接,并存放到linklist当中
ht = etree.HTML(html)
page_linklist = ht.xpath('//div[@class="list_main_content"]/ul/li/a/@href')
for link in page_linklist:
all_linklist.append(str(link))
def get_news_links(start_page,end_page):
for i in range(start_page,end_page): #获取1-122面中所有的新闻链接
html = fetch_page_html('http://news.fzu.edu.cn/html/fdyw/{0}.html'.format(i))
get_news_url(html)
def get_link_content(html): #获取每一面的内容
ht = etree.HTML(html)
title = ht.xpath('//div[@class="detail_main_content"]/p/text()')
news_date = ht.xpath('//div/span[@id="fbsj"]/text()')
author = ht.xpath('//div/span[@id="author"]/text()')
# readcount需要再一次进行请求
pt = re.compile("(.do\?id=)(\d+)(',)")
id = pt.search(html).group(2)
readcount_url = 'http://news.fzu.edu.cn/interFace/getDocReadCount.do?id='+ id
readcount_html = fetch_page_html(url=readcount_url)
news_cotent = ht.xpath('//div[@id="news_content_display"]/p/text()')
print("标题:"+title[0])
print("日期:"+news_date[0])
print("作者:"+author[0])
print("阅读量:"+readcount_html)
print("内容:"+news_cotent[0]+'\n')
if __name__ == '__main__':
all_linklist = []
get_news_links(1,2)
for news_link in all_linklist:
new_url = 'http://news.fzu.edu.cn'+news_link
html = fetch_page_html(new_url)
get_link_content(html)
总结
1.正则表达式使用不熟练,导致 ?没转义 ,一直找不到正则的内 容。。。。
2.重点困难:
对于 阅读量的爬取
因为阅读量是通过json动态显示
不能直接xpath , 所以 还要提取script中的 json 来 找到新的 url 来提取阅读量