利用爬虫收集考试大纲

<p>今天做了个小玩意,但觉得挺有意思的,分享给大家。</p>

<p>主要是这样的,因为帮妹子寻找考试资料,发现同一本书不同的章节分别在不同的链接中,复制起来实在要命,所以就在想能不能用爬虫实现。</p>

我们要爬取得页面,注意看下面叫讲义的表格

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

import requests
from bs4 import BeautifulSoup
url = '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.content
soup = BeautifulSoup(interial, 'html5lib')

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

章节link的在page source中的位置

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

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

import re
link = 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']

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

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

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

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

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

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()

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341

推荐阅读更多精彩内容