写完发现格式不对,有空再研究研究吧,讲的比较细,也算是对自己代码的回顾了。本人初学小白,欢迎大神指点。
接下来就是确定获取方式了,这种简单的程序,我觉得最适合用脚本语言。记得之前Python爬虫课程的广告满天飞,就想到还是用Python写个小程序吧。
所以需要的知识就是:
1.python语法
2.几个python库的使用方式
3.HTML和Javascript的简单阅读分析
感觉python用户起来挺方便的,类库加载非常简单,只需要用pip工具安装一下,再代码里import就可以直接用了。如果是java,总觉得要在项目里配置下脚本,才能自动下载,感觉这样导入太麻烦。
差点跑题了,这些天又重新开始使用python来写一些爬虫,主要是想完成上次未完成的一个爬虫-抓取网易云音乐的歌单。之前只是写到抓取了歌单id,这次我要把歌单里面的歌曲详细信息抓取到excel表格里。(还是下次吧)
用到的库有selenium,BeautifulSoup,xlwt,还有最重要的chromedriver。分析网页主要是静态网页,如果是动态网页就不太好处理了。
之前看过一些python爬虫的文章,大抵介绍两种方式,一种是模拟HTTP请求的方式,另一种就是使用chromedriver。
模拟HTTP请求的方式,非常复杂,各种各样的请求参数就已经很头疼了。但这还不是最麻烦的,最麻烦的是要模拟浏览器请求,怕一个不对,就被服务器拒绝访问了,我晕,那我还不如直接用浏览器访问好了。
于是chromedriver出场了,直接省去了处理HTTP请求响应两大难题,大大简化了网页抓取的难度。可以让我们把精力集中在网页标签的分析上。
dri = webdriver.Chrome(executable_path="chromedriver.exe")
base_url = "https://yz.chsi.com.cn/zsml/queryAction.do"
dri.get(base_url)



select=dri.find_element_by_id('yjxkdm')

select1.click()
s=Select(select)
s.select_by_value('0812')
text=dri.page_source
soup=BeautifulSoup(text,"lxml")
# 页标
index=int(2)
# 获取到最大页标
indexMax=int(2)
for listas in soup.find_all('a'):
try:
inta=int(0)
inta=int(listas.string)
if(inta>indexMax):
indexMax=inta
except Exception as e:
continue
print(indexMax)
以下是全部代码:
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select#select类,下拉菜单使用
from selenium.webdriver.support.wait import WebDriverWait#等待时间包,在限定时间内查找元素
from selenium.webdriver.common.action_chains import ActionChains#鼠标操作包
from selenium.webdriver.common.keys import Keys#键盘操作包
import time#时间包
import unittest#单元测试包
from bs4 import BeautifulSoup
import copy
import xlwt
import re
base_url = "https://yz.chsi.com.cn/zsml/queryAction.do"
# 创建一个浏览器句柄对象
dri = webdriver.Chrome(executable_path="chromedriver.exe")
# 跳转到指定url
# dri.get(base_url)
try:
dri.get(base_url)
except Exception as e:
with open("errorLinks.txt",'w+',encoding="UTF-8") as fFF:
fFF.write(base_url+"\n")
fFF.close()
print(e)
# 选择学科
select=dri.find_element_by_id('yjxkdm')
select.click()
s=Select(select)
s.select_by_value('0812')
sleep(2)
# 选择学习方式
select1=dri.find_element_by_id('xxfs')
select1.click()
s1=Select(select1)
s1.select_by_value('1')
# 非全日制2全日制1
sleep(2)
#确定选择,开始查询
button=dri.find_element_by_name('button').click()
sleep(2)
# #获取源码
text=dri.page_source
# # 解析文件
# soup=BeautifulSoup(open('html.txt',encoding='utf-8'),"lxml")
soup=BeautifulSoup(text,"lxml")
# 页标
index=int(2)
# 获取到最大页标
indexMax=int(2)
for listas in soup.find_all('a'):
try:
inta=int(0)
inta=int(listas.string)
if(inta>indexMax):
indexMax=inta
except Exception as e:
continue
print(indexMax)
fileFirstFloor='firstFloor.txt'
with open("firstLinks.txt",'w',encoding="UTF-8") as f:
f.write("")
f.close()
with open("secondLinks.txt",'w',encoding="UTF-8") as f:
f.write("")
f.close()
# 存放链接数据
# 链接
linkList=[]
# 研究生院,自划线院校,博士点
attrList=[]
# # 解析文件,抓第一页
soup=BeautifulSoup(text,"lxml")
# 循环遍历-target属性为 的标签a
for lista in soup.find_all('a',target="_blank"):
link="https://yz.chsi.com.cn"+lista.get('href')
# 带有=号的才是需要的链接
if("=" in link):
linkList.append(link)
linkList.append("\n")
index=index+1
sleep(2)
for i in range(indexMax):
# 下一页 工学可用
pageInput=dri.find_element_by_class_name('page-input')
pageBtn=dri.find_element_by_class_name('page-btn')
# 输入页码跳转
pageInput.send_keys(index)
pageBtn.click()
text=text+dri.page_source
textNow=dri.page_source
soup=BeautifulSoup(textNow,"lxml")
# 循环遍历-target属性为 的标签a
for lista in soup.find_all('a',target="_blank"):
link="https://yz.chsi.com.cn"+lista.get('href')
# 带有=号的才是需要的链接
if("=" in link):
linkList.append(link)
linkList.append("\n")
index=index+1
if(index==int(11)):
break
sleep(2)
with open("firstLinks.txt",'w',encoding="UTF-8") as fl:
for line in linkList:
fl.write(line+"\n")
# print(text)
fl.close()
with open(fileFirstFloor,'w',encoding="UTF-8") as fFF:
fFF.write(text)
fFF.close()
# 获取第二级链接
secondLinks=[]
for link in linkList:
try:
dri.get(link)
except Exception as e:
with open("errorLinks.txt",'w+',encoding="UTF-8") as fFF:
fFF.write(link+"\n")
fFF.close()
print(e)
# # 解析文件
text=dri.page_source
soup=BeautifulSoup(text,"lxml")
# 页标
indexS=int(2)
# 获取到最大页标
indexMaxS=int(1)
for listasS in soup.find_all('a'):
try:
intaS=int(0)
intaS=int(listasS.string)
if(intaS>indexMaxS):
indexMaxS=intaS
except Exception as e:
continue
print(indexMaxS)
# 循环遍历-target属性为 的标签a
for lista in soup.find_all('a',target="_blank"):
link="https://yz.chsi.com.cn"+lista.get('href')
# 带有=号的才是需要的链接
if("=" in link):
if("https://yz.chsi.com.cn/zsml/kzykskm.jsp?fxid=" in link):
print("假链接")
else:
secondLinks.append(link)
secondLinks.append("\n")
sleep(2)
for pageIndexSecond in range(1,indexMaxS):
# # 解析文件
text=dri.page_source
soup=BeautifulSoup(text,"lxml")
# 循环遍历-target属性为 的标签a
for lista in soup.find_all('a',target="_blank"):
link="https://yz.chsi.com.cn"+lista.get('href')
# 带有=号的才是需要的链接
if("=" in link):
if("https://yz.chsi.com.cn/zsml/kzykskm.jsp?fxid=" in link):
print("假链接")
else:
secondLinks.append(link)
secondLinks.append("\n")
for buttonNextPageSecond in dri.find_elements_by_tag_name('a'):
try:
intaSaa=int(0)
intaSaa=int(buttonNextPageSecond.get_attribute('textContent'))
# print(buttonNextPageSecond.get_attribute('textContent'))
if(intaSaa>pageIndexSecond):
buttonNextPageSecond.click()
break
except Exception as e:
print(e)
continue
sleep(2)
with open("secondLinks.txt",'w',encoding="UTF-8") as fFF:
for line in secondLinks:
if("https://yz.chsi.com.cn/zsml/kzykskm.jsp?fxid=" in line):
continue
fFF.write(line+"\n")
fFF.close()
# 专业目录数组
tableTrs=[[0]*54 for i in range(secondLinksLen) ]
count=int(-1)
for link in secondLinks:
count=count+1
try:
dri.get(link)
except Exception as e:
with open("errorLinks.txt",'w+',encoding="UTF-8") as fFF:
fFF.write(link+"\n")
fFF.close()
print(e)
text=dri.page_source
soup=BeautifulSoup(text,"lxml")
for td in soup.select(".zsml-summary"):
counta=counta+1
strTdContent=td.string
if(counta>9):
break
elif(counta==8):
# 留下数字
tableTrs[count][counta]=re.findall(r"\d+\.?\d*",strTdContent)[0]
else:
tableTrs[count][counta]=strTdContent
counta=counta+1
for mark in soup.select('.zsml-bz'):
try:
if("备" in mark.string):
continue
else:
tableTrs[count][counta]=mark.string
break
except Exception as e:
print(e)
for tda in soup.select('.sub-msg'):
counta=counta+1
if(counta>53):
break
tableTrs[count][counta]=tda.string
if(count%50==0):
with open("rubsh.txt",'w',encoding="UTF-8") as fFF:
for line in tableTrs:
s=""
for linee in line:
s=s+str(linee)
fFF.write(s+"\n")
fFF.close()
sleep(2)
with open("finalContent.txt",'w',encoding="UTF-8") as fFF:
for line in tableTrs:
s=""
for linee in line:
s=s+str(linee)
fFF.write(s+"\n")
fFF.close()
countb=0
workbook = xlwt.Workbook()
sheet = workbook.add_sheet("Sheet Name1")
for b in tableTrs:
countc=0
for c in b:
sheet.write(countb,countc, c) # row, column, value
countc=countc+1
countb=countb+1
workbook.save('Excel_test1.xls')
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p