# 一、目标
新一届的全国大学生智能汽车竞赛开始了,想下载官网上的技术报告,看看大佬们在坐车时候的想法 ,然而官网的技术报告有点多,而且还没打包,得一个一个慢慢点击下载,下载速率太慢了,这不刚学了一下python爬虫吗,就想试试能不能使用python爬虫下载智能车竞赛官网的技术报告。
[**python** 爬虫学习](https://blog.csdn.net/weixin_42585316/article/details/105045725)参见我的这篇文章
[另外我的博客上也有上传](https://thelnktears.github.io/2020/03/13/Python%E7%88%AC%E8%99%AB%E5%AD%A6%E4%B9%A0/)
# 二、目标分析
## 1、技术报告的URL链接
打开官网,找到下载技术报告的页面,因为参赛的队伍比较多,优秀的队伍的技术报告也就多,所以官网将技术报告分到好几个页面中,点击一个选项组,**2019-10-23 第十四届竞赛技术报告(6)** 先找到一个要下载的技术报告,发现点击后就会下载,选中这个技术报告的名字,右键点击检查,查看网页代码,发现技术报告的下载地址就是 `<a>...</a>` 标签内 **href** 后面的链接,这样我们就找到了技术报告的链接地址了,但是一个页面中有那么多技术报告,不能一个一个填啊,所以我们就需要遍历查找这些 `<a>...</a>` 标签,从他的 **href** 属性中获得链接地址。
## 2、下载页面的URL
反过头查看下载页面的 **URL** 连接,发现这不就是竞赛官网的资料下载页面的 **URL** 吗?这咋和下载页面的 **URL** 一样?怎么网页地址没有变。得看一下到底指什么情况,检查一下网页代码,分析情况。
找到要下载的页面选项,将其选中,比如: **2019-10-23 第十四届竞赛技术报告(5)** 选中后右键点击检查,查看源码。
发现这是 **JavaScript** 写的,**void(0)** 是一个点击不发生任何效果,停留在原地,称之为“死链接”,而我们想要的资源列表是在点击这段文字后出现的,那我们怎么的到还有技术报告的页面链接呢?这不是点击后跳转的吗,那就模拟人上网,用鼠标点击这个标签他不就过来了吗?然后经过查找,得出这个页面的连接放在 `<iframe>...</iframe>` 这么一个标签的 **src** 属性中。同样的方法测试别的下载页面都是一样的,所以下载页面的 **URL** 地址也就找到了。
# 三、开始写代码
## 1、获取下载页面的URL
前面分析我们知道,下载页面是 **JavaScript:void(0)** 实现的一个死链接,真正的连接在点击资料下载页面相应的文字后加载到新的资源页面后,在一个 `<iframe>...</iframe>` 标签的 **src** 属性里。我们要获得真正的下载页面的 **URL** 地址需要模拟鼠标点击,所以我们使用 **selenium** 模块中的 **webdriver**,所以先将模块导入。
```python
from selenium import webdriver
```
接下来就快开始构建一个浏览器对象,使用无头浏览器模拟点击各个标签获取到下载页面的地址先保存起来。
```python
def geturl(begainurl, href):
'''
从主页开始,遍历我们想要的页面,获得页面地址
:param begainurl: 主页的url连接
:param href: 每个子页面的连接
:return: None
'''
options = webdriver.ChromeOptions() # 实例化Chrome浏览器的设置
options.add_argument("--headless")
options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=options) # 实例化Chrome浏览器
driver.get(begainurl) # 从主页开始
# 以下使我们要点击的标签的 xpath ,发现只有 li 标签后缀再改
# "/html/body/div[4]/div[3]/div[1]/ul/li[7]/a/span[1]"
# "/html/body/div[4]/div[3]/div[1]/ul/li[6]/a/span[1]"
# "/html/body/div[4]/div[3]/div[1]/ul/li[5]/a/span[1]"
# "/html/body/div[4]/div[3]/div[1]/ul/li[4]/a/span[1]"
# "/html/body/div[4]/div[3]/div[1]/ul/li[4]/a/span[1]"
# "/html/body/div[4]/div[3]/div[1]/ul/li[2]/a/span[1]"
# "/html/body/div[4]/div[3]/div[1]/ul/li[1]/a/span[1]"
for i in range(1, 7):
xpath = "/html/body/div[4]/div[3]/div[1]/ul/li[" + str(i) + "]/a/span[1]" # 构造xpath
# print(xpath)
href1 = driver.find_element_by_xpath(xpath).click() # 寻找对应的元素并且点击进入下一个页面
soup = bs4.BeautifulSoup(driver.page_source, "html.parser") # 解析页面代码文件
url = soup.iframe.attrs["src"] # 获取想要的连接地址
print(url)
href.append(url) # 将地址添加到列表当中
time.sleep(2) # 等待页面加载完毕
driver.get(begainurl) # 从主页开始
time.sleep(2)
time.sleep(2)
driver.close() # 关闭浏览器页面
driver.quit()
# print(href) # 打印获取到的连接列表
```
## 2、获取技术报告的URL
得到每个下载页面的 **URL** 后我们需要从每个下载页面得到技术报告的 **URL** 链接,这些链接才是我们真正下载时候需要的页面,通过前面分析,技术报告的 **URL** 链接在 `<a>...</a>` 标签的 **href** 属性中。遍历我们保存的下载页面的 **URL** ,访问这些 **URL** 获取到每个页面的网页代码,从中在遍历查找 `<a>...</a>` 标签,获取到技术报告的 **URL** 。
遍历下载页面的 **URL** ,获得每一页的网页源代码
```python
def getHTMLText(href, html):
'''
从每一页的连接中获取每一页的HTML代码
:param href: 每一页的连接地址,用列表表示
:param html: 每一页的HTML代码,用列表表示
:return: None
'''
try:
i = 0
for connection in href: # 遍历每一页的连接地址
print("............................................................")
print("开始解析")
print(connection) # 打印将要解析的连接地址
files = requests.get(connection) # 爬取每个页面的HTML地址
# print(files.status_code)
files.raise_for_status() # 检查返回状态,200 为连接正常,否则产生异常
files.encoding = files.apparent_encoding
# print(files.text)
soup = bs4.BeautifulSoup(files.text, 'html.parser') # 解析页面文件
html.append(soup) # 将每页的HTML源码文件添加到html的列表中
i = i + 1
# print(soup.prettify())
# print(html)
print("..........................................................................")
except:
print("异常")
```
遍历获得到的网页源代码,从 `<a>...</a>` 标签获取到技术报告的 **URL**
```python
def getHref(html, url):
'''
从每页的HTML源码文件中获得资源文件的名称和连接
:param html: 每页的HTML代码
:param url: 每一个资源文件的地址和名称,用字典保存
:return: None
'''
# print(html.a.attrs)
i = 0
for i in html: # 遍历每一资源页
for link in i.find_all("a"): # 查找资源页的资源地址
# print(link.string)
# print(link.get("href"))
hrefstring = str(link.string).strip() # 去掉资源名称中的空格\r\t等字符
hrefURL = str(link.get("href")).strip() # 去掉资源地址中的空格\r\t等字符
# href.update(link.string , link.get("href"))
# print(href[link.string])
url[hrefstring] = hrefURL # 将资源保存到列表中
# print(url)
```
## 3、筛选得到的URL
参看每个下载页面的内容发现,其实每个下载页面的内容挺乱的,出了要下载的技术报告外,里面还有像车模检查表、参赛证明、车模照片、电路图等,特别乱,像车模检查表这些我们都不需要,所以我
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的竞赛项目学习资料,作为参考学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于python爬虫下载恩智浦智能车竞赛技术报告(源码).zip
资源推荐
资源详情
资源评论
收起资源包目录
基于python爬虫下载恩智浦智能车竞赛技术报告(源码).zip (3个子文件)
code_20105
reptilefromsmortcar.py 7KB
chromedriver.exe 7.7MB
README.md 19KB
共 3 条
- 1
资源评论
土豆片片
- 粉丝: 1573
- 资源: 5636
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功