Python 爬虫 2 爬取多页网页
参考资料:极客学院: 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'] +'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'
- 04.Java对象和类
- 关于Oracle数据恢复的两个临界点(r5笔记第42天)
- 关于提问的一些建议(r5笔记第41天)
- shell中echo的显示格式 (r5笔记第58天)
- springboot 入门教程(5) 基于ssm框架的crud操作(前端部分-附源码)
- springboot入门(4)_web开发
- springboot入门教程(2)_Thymeleaf集成
- VList data structures in C#
- 编程思想 之「语言导论」
- 编程思想 之「对象漫谈」
- Github 项目推荐 | TensorFlow 概率推理工具集 —— probability
- Github 项目推荐 | 用于 C/C++、Java、Matlab/Octave 的特征选择工具箱
- Mercari Price 比赛分享 —— 语言不仅是算法和公式而已
- Github 项目推荐 | GAN 的 Keras 实现案例集合 —— Keras-GAN
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Typecho 仿简书主题 时间轴归档页实现
- Typecho如何添加“编辑”当前文章按钮
- Flutter入门第二讲:项目运行,Hello world
- Flutter入门第一讲:环境搭建(mac os为例)
- 第12天:NLP补充——HMM(隐马尔科夫模型)
- android View事件分发实测
- LeetCode51|寻找旋转排序数组中的最小值
- Yapi 可视化接口平台安装实践
- LeetCode50|搜索旋转排序数组II
- LeetCode49|搜索旋转排序数组
- 第13天:NLP补充——RNN算法
- Android自定义跑马灯效果(适合任意布局)
- Handler Looper.prepareMainLooper();源码分析
- Caused by: java.lang.IllegalStateException: System services not available to Activities before onCre
- Actuator与服务监控