参考资料:极客学院: Python单线程爬虫
代码:2.Single-thread-crawler.ipynb
本文内容:
- Requests.get
- 爬取多个页码的网页
- 例:爬取极客学院课程列表
爬虫步骤
- 打开目标网页,先查看网页源代码
- 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'