zoukankan      html  css  js  c++  java
  • Python爬虫抓取收集考试大纲

    今天做了个小玩意,但觉得挺有意思的,分享给大家。主要是这样的,因为帮妹子寻找考试资料,发现同一本书不同的章节分别在不同的链接中,复制起来实在要命,所以就在想能不能用爬虫实现。下图是我们要爬取得页面,注意看下面叫讲义的表格

    欢迎加入我的QQ群`923414804`与我一起学习,群里有我学习过程中整理的大量学习资料。加群即可免费获取

    首先结合Request和BeautifulSoup来对这个主页进行处理,提取不同章节的href。在这里需要注意,我们的页面是html类型(看网址结尾)。BeautifulSoup中,网页解析器要采用lxml的话,会有半截页面解析不出来。这里使用html5lib解析器。

    import requestsfrom bs4 import BeautifulSoupurl = 'http://www.exam8.com/kuaiji/shuiwu/fudao/201603/3564185.html'headers = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",           "Host":'www.exam8.com',           "Referer":"http://www.exam8.com/kuaiji/shuiwu/fudao/201606/3684910.html"}interial = requests.get(url, headers = headers)interial = interial.contentsoup = BeautifulSoup(interial, 'html5lib')
    

    页面解析出来后,发现解析内容和页面的page source一样,亦即使没有采用js加载内容。通过Inspect定位链接地址,很轻易能找到以下内容,发现所有的章节都在标签为td,分类(class)为lianjie或者lianjielanse里面:

    章节link的在page source中的位置

    这个时候可以通过Beautiful里面的find_all来将符合条件的链接找出来。但同时我们看到两个class其实是有共同点的(前面都是lianjie),这样我们可以将find_all结合正则表达式来减轻我们的工作,详细说明可以看这里的搜索文档树章节。

    注意,网址所列出的课程章节是有重复(时间上有更新)的,我这里省方便就没有考虑这个问题了。另外,章节表格最右下角有个空格,实际也是有自己的href的,但既然主页将它隐藏了,那么我们在挑选的时候,也将其排除。

    import relink = dict()for tag in soup.find_all('td', class_=re.compile('lianjie')):    atag = tag.a    atagtext = atag.get_text()    if atagtext != '':        link[atagtext] = atag['href']
    

    这样就得到一个包含章节题目以及网址的dict了。后面只需要对dict里面的网址内容进行爬虫就好了。

    newpage = requests.get(link1, headers=headers)newsoup = BeautifulSoup(newpage.content, 'html5lib')
    

    通过Ctrl+F比较快就能定位到内容了。一开始以为这个class是一个定值,后面做循环的时候才发现不是。查看上下文,看到上面有一个class里面包含定值ArticleIntro,并且全文只有你一个,就通过你来定位(注意ArticleIntro后面那段英文也是随机的,所以这里也要用正则表达式提取)。

    章节内容的page source的位置以及定位

    提取出来的div中,有一些内容是我们不需要的,可以通过BeautifulSoup中的decompose命令结合children和find将他们剔除后删除。

    text = newsoup.find('div', class_ = re.compile('ArticleIntro'))text.p.decompose() ##删除第一个标签##后面的通过children建立一个子标签的循环,将我们不需要的decompose就好。另外,每个节点之间存在空行,需要剔除出来。for t in text.children:    if (t.name == 'p' and t.find('a') == None) or t.name = 'tbody':        continue    elif t.name == None:        continue    else:        t.decompose()
    

    这样就干净了。最后加入循环实现批量处理就好了。对我们的link建立循环,并且将提取出来的内容写入到html结尾的文件中,注意文件打开方式应该是'a',因为你需要appending:

    fp=open(‘filename.html’,'a')fp.write(str(text))fp.close()
    

    最后结果只要用浏览器打开就好了。当然,你也可以通过weasyprint将结果输出为pdf。

  • 相关阅读:
    错误 1324。文件夹路径 .. 中含有无效的字符
    linux下 tar解压 gz解压 bz2等各种解压文件使用方法
    取消EXCEL 2007/2010中邮箱地址的自动链接
    Windows2000/XP启动过程详解
    Ubuntu下安装apache2,mysql,php,wordpress.
    offcie2007,2010,2012中快速删除指定的页面.
    mysql连接,修改密码,增加用户,显示,导入导出
    键盘各按键的使用
    cvim 使用
    matlab基础知识(basic operation)
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10291464.html
Copyright © 2011-2022 走看看