1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
import
requests
import
re
#启动两个必备模块#
class
=
spider(
object
):
#先设定一个类,类名叫spider,他的父类是object#
def
getsource(
self
,url):
#这个类有个属性叫getsource,它需要一个变量url#
html
=
requests.get(url)
#用过request.get获得所瞄准页码的源代码#
return
(html.text)
def
changepage(
self
,url,total_page):
#这个类有个属性叫changepage#
now_page
=
int
(re.search(pageNum
=
"(\d+)"
,url,re.S).group(
1
))
#当前的页数---这里获得的是一个纯数字的,它是从url上获得的,写这个命令的目的是定位头数字,前面加上了int等于把这个结果改编成int形式#
page_group
=
[]
for
i
in
range
(now_page,total_page
+
1
):
link
=
re.sub(pageNum
=
"(\d+)"
,pageNum
=
i,url,re.S)
#这个语句的目的是把url里的数从now_page换到total_page+1,这样的walk一遍,达到翻页的目的,这里link会生成好几个url#
page_group.append(link)
return
(page_group)
#把生成的那些url放到了page_group这个空列表里#
def
geteveryclass(
self
,source):
#这个属性叫geteveryclass,作者他是要把一节课所有的相关介绍内容都一把抓下来,然后再细细分掉#
everyclass
=
re.findall()
return
(everyclass)
def
getinto(
self
,everyclass):
info
=
{}
#这里生成了一个空的字典映射#
info[
"title"
]
=
re.search()
#通过字典映射的提取功能,来从上面那一把抓里提取出相关的东西,对应的生成物就是属于了info这个列表里的title这个key的value。注意!生成的东西是一个列表#
info[
"content"
]
=
re.search()
timeandlevel
=
re.search()
#这俩目标有相同的定位符,因为是列表,就一会使用序号单独分开#
info[
"classtime"
]
=
timeandlevel[
0
]
info[
"classlevel"
]
=
timeandlevel[
1
]
info[
"classnumber"
]
=
re.search()
return
(info)
def
saveinto(
self
,classinto):
f
=
open
(
"e:/pythonaaa/b/study & test/1919.txt"
,
"a"
)
for
each
in
classinto:
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(
"classnumber:"
+
each
"classlevel"
+
"\n"
)
f.close()
if
__name__
=
"__main__"
classinto
=
[]
url
=
"http://www.jikexueyuan.com/course/?pageNum=1"
jikespider
=
spider()
#这次行动的实例化名称叫jikespider,他属于spider这个类#
all_links
=
jikespider.changepage(url.
20
)
#在翻页的那个属性里,我们要翻到第20页#
for
link
in
all_links:
#把这20个页单独拆开#
print
(
"正在处理画面"
+
link)
html
=
jikespider.getsource(link)
#获得了每一个页的源代码#
everyclass
=
jikespider.geteveryclass(html)
#获得了这20页的每一个课程的所有介绍#
for
each
in
everyclass:
#又把这20页里每一个课程单独拆开#
info
=
jikespider.getinfo(each)
#对应的每一节课的名称、介绍、等级、时长、人数都做成了一个字典,一一对应,生成了这样的一个info字典映射#
classinto.append(info)
#classinto这个空列表已经被info的内容装满#
jikespider.saveinfo(classinfo)
#行动以classinfo为变量启动了saveinfo这个属性#
|
==================================分割线===========================================
1)很多网站虽然显示出来很光鲜靓丽,但是源代码很是混乱,黏黏糊糊成一团,看起来非常恶心,但是这样不空格不回车的代码,在“夹逼正则”的时候非常好夹,因为没有那些看不见的/n和/t,看到正则的定位符就可以下手。
2)有些网站源代码写得很清晰,这样反而在“大锤敲缝”的定位上不太好把握,因为定位<html><div><hL<li>这种网页语言标志符是没用的,要定位就定位有特征的字符。
3)这个代码写得很棒,思路也很清晰,就好像控制一个机器人去桌子边拿一杯水,他先给予机器人几个能力,比如:能走路,知道哪里是桌子,识别水杯,能水杯口向上的抓住水杯,返回。先把这几个能力写明白、写清楚。然后启动这个机器人去做这个事情。这个代码的思路值得学习,但是难点就是变量的不断更替上,有一点跟不上,就会绊住。
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1730164