First 爬虫
这是昨天下午自己突然觉得想爬点东西就开始着手写自己的爬虫。我爬的是廖雪峰老师的python课程。这是我之前见过一个代码也是爬他的网站的。自己觉得爬爬也不错。
第一步 模仿
我的第一步是仿照人家的代码,然后,自己怎么也没有搞定。问题一大
堆,后来想了想可能是由于python的版本问题。我用的是python2.7
.现在python3 因为强大的功能,越来越多的人都在使用。但我不需要
那么强大的功能,所以就用python2.7就可以了。
第一步:自己查看他的源代码和自己找的例子来分析他的思路
第二步:自己查找资料,练习和测试
第二步 写
从自己的模仿阶段发现自己越模仿越觉得乱。所以自己就开始一个模块
模块的写。首先明确自己的目标,爬取文章内容。从这方面看,自己做
的第一件事就是把网页弄下来。这比较简单,用urllib中的urlopen().read就可以把网页弄下来(这个网页比较简单,复杂的话需要伪装浏览器,模拟登陆等)把网页弄下来之后,自己就开始尝试分析网页,把网页里面的文章内容取
出来,自己查了很多资料,结合自己的水平,这个正则表达式是比较合适
的。我自己用正则表达式做了很多的筛选,包括,文章内容,还有网页中
网络的网址。都是用正则表达进行的筛选,因为自己的能力有限,所以许
多东西分开做比较适合自己。多测试,一步接一步。
下面把自己的代码贴出来
#coding=utf-8
import re
import urllib2
def webspider(url):
#获取网页信息
Mypage=urllib2.urlopen(url).read()
#正则表达式匹配
MyItem=re.compile(r"<div class=\"x-wiki-content\">(.*?)</div>",re.S)
match=MyItem.search(Mypage)
text=match.group(1)
#print text
#去除特定的字符串
text1=text.replace('<p>',' ') # 赋值
text2=text1.replace('</p>',' ')
text3=text2.replace('<code>',' ')
text4=text3.replace('</code>',' ')
#修改字符串常用的标示 ' 代表’ > 代表 >
text5=text4.replace(''','\'')
text6=text5.replace('>','>')
text7=text6.replace('<li>','*').replace('</li>','')
#写入文本文件中
save=open('python.txt','a')
save.write(text6)
save.close()
#print type(text)
#print text2
def geturl(url):
#批量获取网页中的教程网址
Mypage=urllib2.urlopen(url).read()
MyITem=re.compile(r'margin-right:-15px;\">(.*?) </ul>',re.S)
match=MyITem.search(Mypage)
text=match.group(0)
#print text
#print type(text)
myurl=re.compile(r'<a href="/wiki(.*?)\">',re.S)
getmyurl=myurl.findall(text)
dima='http://www.liaoxuefeng.com/wiki'
#print dima+getmyurl[0]
#print type(getmyurl[0])
#构建成全新的网址
for a in getmyurl:
b=dima+a
#去除空格
b1=' '.join(b.split())
print b1
#调用直接分析
webspider(b1)
if __name__ == '__main__':
#web='http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000'
web='http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013747381369301852037f35874be2b85aa318aad57bda000'
geturl(web)