python第二轮考核

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

@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 来提取阅读量

猜你喜欢

转载自blog.csdn.net/qq_53755216/article/details/111845543