Python 爬虫 2 爬取多页网页

时间:2022-05-06
本文章向大家介绍Python 爬虫 2 爬取多页网页,主要内容包括本文内容:、爬虫步骤、Requests 收录了 python 的第三方http库、1. Requests.get、2. 爬取多个页码的网页、3. 爬取极客学院课程列表、从大到小:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

参考资料:极客学院: 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'] +'nn')
        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'