Python 爬虫 2 爬取多页网页

参考资料:极客学院: Python单线程爬虫

代码:2.Single-thread-crawler.ipynb

本文内容:

  1. Requests.get
  2. 爬取多个页码的网页
  3. 例:爬取极客学院课程列表

爬虫步骤

  • 打开目标网页,先查看网页源代码
  • get网页源码
  • 找到想要的内容,找到规律,用正则表达式匹配,存储结果

Requests 收录了 python 的第三方http库

  • 完美地替代了 python 的 urllib2 模块
  • 更多的自动化,更友好的用户体验,更完善的功能

1. Requests.get

import requests
import re
# 将百度贴吧 python吧 的首页源代码获取下来
html = requests.get('http://tieba.baidu.com/f?ie=utf-8&kw=python')
# print html.text
# 这里并没有遇到取不到的情况,所以没有用到hea
# 这个程序没有获得源代码,因为一个网站会对访问他的程序进行检查
# hea是我们自己构造的一个字典,里面保存了user-agent
# hea = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}
# html = requests.get('http://jp.tingroom.com/yuedu/yd300p/',headers = hea)

html = requests.get('http://jp.tingroom.com/yuedu/yd300p/')
html.encoding = 'utf-8'          #这一行是将编码转为utf-8否则中文会显示乱码。
# print html.text
title = re.findall('color:#666666;">(.*?)</span>',html.text,re.S)
for each in title:
    print each

第二章 昔々、といってもせいぜい二十年ぐらい前のことなのだ...
挪威的森林(中日对照) 内容简介: 汉堡机场一曲忧郁的《挪...
藤野先生名文选读中日文对照 東京も格別のことはなかつた。上...
夏目漱石 我是猫(中日对照) 吾輩は猫である 夏目漱石 一 吾輩...
それお皿の絵柄よ 足のケガで中クラスの総合病院に入院しまし...
あるけちん坊(ぼう)な男がおりました。 毎日毎日,ご飯どき...
あるところに,たいへんへそまがりな息子(むすこ)がおりま...
向こうから,お医者(いしゃ)がやってきました。そこへ店(...
お盆休み(ぼんやすみ)に帰ってきた者(もの)同士(どうし...
昔(むかし),三太(さんた)という,ばかな息子がおりまし...
ある日のこと。 そこつ者が,瀬戸物(せともの)屋(や)へ,...
植木(うえき)の大好きな旦那(だんな)がおりました。 ある...
息子が表(おもて)で,凧(たこ)を揚(あ)げておりました...
ある夜(や)のこと,お寺(てら)の庭(にわ)で,小僧(こ...
はくうんしゅうしょく 一匹のトンボが夏の終わりを告げるわけ...
先日、ある研修で聞いた言葉ですが、 「学習」の本質を端的に...
闇夜(やみよ)に,二人の若い男が,こそこそ話しております...
ある役人が誕生日のときに、下役たちは彼が鼠年だと聞き、お...
東京の郊外に住む木村さんは、お酒を飲んでの失敗の多い人で...
ある人が新調した絹の裾/裙(すそ、はかま)を着用して外出...

chinese = re.findall('color: #039;">(.*?)</a>',html.text,re.S)
for each in chinese:
    print each

300篇精选中日文对照阅读 289 挪威的森林(中日对照)第二章
300篇精选中日文对照阅读 288 挪威的森林(中日对照)第一章
300篇精选中日文对照阅读 287 藤野先生——名文选读
300篇精选中日文对照阅读 286 夏目漱石 我是猫 第一章
300篇精选中日文对照阅读 285 それお皿の絵柄よ
300篇精选中日文对照阅读 284 つもり
300篇精选中日文对照阅读 283 遺言(ゆいごん)
300篇精选中日文对照阅读 282 やぶ医者
300篇精选中日文对照阅读 281 表札
300篇精选中日文对照阅读 280 ととの目
300篇精选中日文对照阅读 279 つぼ
300篇精选中日文对照阅读 278 用心
300篇精选中日文对照阅读 277 凧揚げ
300篇精选中日文对照阅读 276 星取り
300篇精选中日文对照阅读 275 白云愁色
300篇精选中日文对照阅读 274 学習とはパラダイム変換だ
300篇精选中日文对照阅读 273 偷柿子的贼
300篇精选中日文对照阅读 272 胃口更大
300篇精选中日文对照阅读 271 这不是你家
300篇精选中日文对照阅读 270 矫揉做作

2. 爬取多个页码的网页

爬虫只能爬网页上看得见的内容

url = 'https://www.crowdfunder.com/browse/deals'
html = requests.get(url).text
# print html
# 因为这个网站的例子,已经不用 show more,而改成页码了,所以方法和上次练习的方法一样,下面这个代码没有用了,它只能搜到第一个页面的内容
# 构造字典 data
# 注意这里的page后面跟的数字需要放到引号里面。
url = 'https://www.crowdfunder.com/browse/deals&template=false'

data = {
    'entities_only':'true',
    'page':'2'
}
html_post = requests.post(url,data=data)
title = re.findall('"card-title">(.*?)</div>',html_post.text,re.S)
for each in title:
    print each

DIGITZS
AUGMATE
GOCOIN
GOODWORLD
REVL
IECROWD
SELFIE WITH ME
LOOK AT YOU
SANTO DIABLO MEZCAL
NINJA METRICS

# 用这个网址来取标题
url = 'https://www.crowdfunder.com/?q=filter&page=3'
html = requests.get(url).text
# html = requests.get(url).text
title = re.findall('"card-title">(.*?)</div>', html, re.S)
for each in title:
    print each

ULTRASOUND SOLUTIONS
BLACK FLAG ALEWERKS
AMERIVEST LIMITED PARTNERSHIP
ENDURING INVESTMENTS
HURDL ENTERPRISES
VAPETEK
ZOGANIC DELICIOUS HEALTH
WHICH WINERY
PREMIER ONE LENDERS
PAX - PERSONAL AIRLINE EXCHANGE
LOEB'S CRUNCH
EM&N8, CONTROLLERS INCORPORATED
CLOUDBURST ROOM ESCAPE
MOO MOO FARMS
BIOFAB
OPENDOOR COLIVING

url = 'https://www.crowdfunder.com/?q=filter&page=1'
for i in range(1,4):
    print i
    
    new_link = re.sub('page=\d+','page=%d'%i, url, re.S)
    print new_link
    
    title = re.findall('"card-title">(.*?)</div>', new_link, re.S)
    print title                            # title是空的,因为规律不对了,需要自己重新找一下规律
    
    for each in title:
        print each

1https://www.crowdfunder.com/?q=filter&page=1[]
2https://www.crowdfunder.com/?q=filter&page=2[]
3https://www.crowdfunder.com/?q=filter&page=3[]

3. 爬取极客学院课程列表

url = 'http://www.jikexueyuan.com/course/?pageNum=2'
html = requests.get(url).text
# print html
classinfo = re.findall('(<li id=.*?</li>)', html, re.S)
# for each in classinfo:
#     print each

分析代码:

下面代码,就是将 极客学院课程页的前5页里,课程的信息提取出来,存进一个txt文件中。
先运行,看结果怎么样

从大到小:

  • 1.产生不同的页码的链接

  • 2.每个链接,先获取网页源代码

  • 3.每个页面内,先抓每个课程的版块

  • 4.每个课程版块内,抓title,content,time,level,people,存到字典里

  • 5.最终结果保存到txt文件中

  • Tips:
    网页源码有时会变的,不要照搬下面代码,出不来结果时,自己找一下匹配的规律,重新写匹配规则。

class spider(object):
    def __init__(self):
        print u'开始爬取内容。。。'

#changepage用来生产不同页数的链接
    def changepage(self,url,total_page):
        now_page = int(re.search('pageNum=(\d+)',url,re.S).group(1))
        page_group = []
        for i in range(now_page,total_page+1):
            link = re.sub('pageNum=\d+','pageNum=%s'%i,url,re.S)
            page_group.append(link)
        return page_group
    
#getsource用来获取网页源代码
    def getsource(self,url):
        html = requests.get(url)
        return html.text
    
#geteveryclass用来抓取每个课程块的信息
    def geteveryclass(self,source):
        #everyclass = re.findall('(<li deg="".*?</li>)',source,re.S)                      # This code is old.
        everyclass = re.findall('(<li id=.*?</li>)',source,re.S)
        return everyclass
    
#getinfo用来从每个课程块中提取出我们需要的信息
    def getinfo(self,eachclass):
        info = {}
        #info['title'] = re.search('target="_blank">(.*?)</a>',eachclass,re.S).group(1)   # This code is old.
        info['title'] = re.search('title="(.*?)"',eachclass,re.S).group(1)
        
        #info['content'] = re.search('</h2><p>(.*?)</p>',eachclass,re.S).group(1)         # This code is old.
        info['content'] = re.search('<p style="height: 0px; opacity: 0; display: none;">(.*?)</p>',eachclass,re.S).group(1)
        
        timeandlevel = re.findall('<em>(.*?)</em>',eachclass,re.S)
        info['classtime'] = timeandlevel[0]
        info['classlevel'] = timeandlevel[1]
        info['learnnum'] = re.search('"learn-number">(.*?)</em>',eachclass,re.S).group(1)
        return info

#saveinfo用来保存结果到info.txt文件中
    def saveinfo(self,classinfo):
        f = open('info3.txt','a')
        for each in classinfo:
            f.writelines('title:' + each['title'] + '\n')
            f.writelines('content:' + each['content'] + '\n')
            f.writelines('classtime:' + each['classtime'] + '\n')
            f.writelines('classlevel:' + each['classlevel'] + '\n')
            f.writelines('learnnum:' + each['learnnum'] +'\n\n')
        f.close()

if __name__ == '__main__':

    classinfo = []                                          #存放最终结果
    url = 'http://www.jikexueyuan.com/course/?pageNum=1'    
    jikespider = spider()
    all_links = jikespider.changepage(url,5)                #产生不同的页码的链接
    
    for link in all_links:
        print u'正在处理页面:' + link
        html = jikespider.getsource(link)                   #每个链接,先获取网页源代码
        everyclass = jikespider.geteveryclass(html)         #每个页面内,先抓每个课程的版块
        for each in everyclass:
            info = jikespider.getinfo(each)                 #每个课程版块内,抓title,content,time,level,people,存到字典里
            classinfo.append(info)

    jikespider.saveinfo(classinfo)                          #最终结果保存到txt文件中

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

推荐阅读更多精彩内容

  • 1.暗闇より夜魔来たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙诺瓦阅读 3,226评论 0 7
  • 1.暗闇より夜魔来たる-1あなたはきっとこんな私をお許しにはならないでしょう…ですが、私はあなたを守る以外の何かを...
    波沙诺瓦阅读 1,902评论 1 2
  • 陽の光 闇の月 陽も月も異なれど、同じように地上を照らす。けれど、両者は決してまみえることはない。陽が輝くとき月は...
    波沙诺瓦阅读 2,233评论 0 7
  • 感恩老客户,刘总的支持,本来他要下个月才要补货的,他说看我这个月销售不够好,支持我一下,先少发一点货。感恩刘总的支...
    那朵花蕾阅读 130评论 0 0
  • 一、老公和孩子的30个优点 1、老公30个优点 1、有耐心;2、注重细节;3、唱歌一级棒;4、音乐知识丰富;5、孝...
    佳丽_81ea阅读 166评论 0 0