最近学习python爬虫,总结一下遇到的问题。
(菜鸡一个,还望大佬指点。其中许多代码借鉴了别人博客中分享的代码。)
第一个项目是爬取校园的课程表,难点主要在于模拟登陆之后如何继续从登陆之后的网页中爬取信息,(因为我在学习的时候只学习了用request里的基础方法登陆,但是那样会导致登陆之后依然要重新登陆网页,查阅各个博客之后发现使用webdriver更为方便)
模拟登录的方法:
driver=webdriver.Chrome() #启动浏览器
url=‘学校的登录页面的网站’
requests.session()
driver.get(url) #用浏览器访问url
num = input('学号')
key = input('密码')
driver.find_element_by_id("UserName").clear() #查看源码并填入源码中用户名 的id,比如‘login_email’,该行是用来清除在登录前登录框中的字
driver.find_element_by_id("UserName").send_keys(num) #输入用户名
driver.find_element_by_id("passWord").clear() #查看源码并填入源码中密码的id
driver.find_element_by_id("passWord").send_keys(key) #输入密码
# driver.switch_to.frame("loginframe")
driver.find_element_by_class_name("btn").click() #查看源码中登录按钮的class名
time.sleep(5)
title=driver.title
now_url=driver.current_url
还有一个难点就是我们学校的网站的源代码是附上链接,点击链接之后会提供课表,这里需要注意的是要维持网站登录的状态,不能另外直接用requests方式打开,我用的是webdriver,这样可以模拟在一个浏览器中。
最后解决问题用的代码
soup = BeautifulSoup(text, "html.parser")
next_html = soup.find(id='main')
timetable = 'http://59.77.226.35/' + next_html.attrs['src']
#以上是获得链接
#之后直接在启动的浏览器里再次打开新的页面
driver.get(timetable)
names = driver.find_element_by_id('form1').text
#print(names)
之后还有一个小问题就是爬取课表分布不是在一起的,需要单独去爬取,而之前因为使用的是webdriver获得代码,因此需要使用find_element方法
browser.find_element_by_id('q')
browser.find_element_by_css_selector('#q')
browser.find_element_by_xpath('//*[@id="q"]')
但是xpath或者css_selector的路径如果自己写会很麻烦,我纠结了很长时间,但是我之后发现开发人员工具可以直接获得(憨憨石锤)
第二个项目是爬取网站的信息,网页如图
这个题目的难点在于爬取的信息中存在动态数据,即ajax类型,但是直接通过webdriver形式爬取的话就可以获得(图片如下,阅读数无法在页面源代码中获得)
这是页面源代码,里面没有459这个数字
这是开发人员工具中的代码,可以获得此数据但是webdriver相当于从开发者工具中模拟直接获得,数据可以直接获得
下面是源代码供参考
def getHTMLArticle(lst, url):#得到网站文字
try:
getAuthors = []
browser = webdriver.Chrome()
html = browser.get(url)
read = browser.find_element(By.ID, 'readcount').text##就是这里,用webdriver贼方便有时候
time = browser.find_element(By.ID, 'fbsj').text
author = browser.find_element(By.ID, 'author').text
getAuthors.append(time)
getAuthors.append(author)
getAuthors.append(read)
browser.close()
html = getHTMLText(url)
soup = BeautifulSoup(html, "html.parser")
title = soup.find('title').text
getAuthors.append(title)
art = soup.find('div', style="margin: 0 15px 0 15px;", id="news_content_display")
articleHTML = art.find_all('p')
for i in articleHTML:
article = i.get_text()
lst.append(article)
return getAuthors
except:
print('失败了')
return "失败了"