最近在开始学Python 也想着做个爬虫玩玩

之前学习(php,jquery...)的时候,经常去菜鸟教程看。索性就将其教程爬下来(打印出来)翻阅起来更有感觉。

好了废话不多说先讲讲我的思路:

首先先对网站的页面进行分析

网页的结构还是比较清晰的【开心.jpq】。

我们先要获取这篇教程的所有内容的连接(url)

通过F12 查看网页html

我们需要把这里(目录)所有的url保存下来,然后逐个下载筛选其内容

现在完成第一步,筛选目录的连接

我用了pyquery这个包(pip install pyquery) 他可以用像jQuery风格操作DOM

先引入包 ,写好需要的配置信息。

下面开始正式撸代码了

我们刚才的需求是获取所有的目录连接

def getUrlLinks(url):

global config # 配置信息用全局变量

Urls = [] # url连接池

httpf = request.Request(url,headers=config['h'])

try:

reqL = request.urlopen(httpf,timeout=30)

except :

return False

else :

content = reqL.read()

finally:

try:

reqL.close()

except :

return False

# Query 操作

# con = content.decode("utf-8")

con = gzip.decompress(content).decode("utf-8") #解压网页数据

dom = pq(con) # 初始化Query操作

title = dom('title').text() # 筛选当前页面的标题

dom = dom('div#leftcolumn')

dom = dom('a')

dom = dom.make_links_absolute(base_url=config['url']) #将相对链接转换为绝对链接

for one in dom.items(): # 遍历所有筛选出来的 pyQuery对象获取其href属性

Urls.append(one.attr('href'))

return Urls,title # 返回连接池及标题在请求头(header)中 我们有这一条

所以,请求的网页数据需要解压(

con = gzip.decompress(content).decode("utf-8") #解压网页数据

) 才能utf-8解码

dom = dom('div#leftcolumn')

dom = dom('a')通过pyquery 直接筛选id=leftcolumn的div, 再获取下面所有的a标签。

将a标签的href属性转化为绝对地址,并遍历所有pyquery对象 获取其href属性保存在Urls 中

函数写好后,我们来测试一下:

基本完成了我们所想的。ok 下一步!

我们现在要对网页内容进行分析:获取教程的正文【方法同上F12】

# 获取网页内正文并返回html格式文本

def url2con(url):

global config

httpf = request.Request(url,headers=config['h'])

try:

reqL = request.urlopen(httpf,timeout=30)

content = reqL.read()

except :

return False

finally:

try:

reqL.close()

except :

return False

# con = content.decode("utf-8")

con = gzip.decompress(content).decode("utf-8") #解压网页数据

# Query 操作 筛选内容

dom = pq(con)

tit = dom('title').text()

dom = dom('div.article-body')

dom = dom.make_links_absolute(base_url=config['url']) #将相对链接转换为绝对链接

con = dom.html()

return con,tit

有没有发现用pyquery解析网页真的是超级简单

这两个函数都写好了。那么我们所要的零部件都齐了。开始组织程序的逻辑吧!

上面两个函数都做了(没做)异常处理。所以我写了个函数做超时重连(重连次数默认5次)

# 超时重连函数

def reLink(fun,para,retime=5):

con = fun(para)

i = 0

while retime and(con ==False) :

i += 1

con = fun(para)

print("miss url(%s) reLink %d "%(para,i))

retime -= 1

return con

主函数逻辑:

为了保证格式:我们引入他的css文件:

-----ok 就写到这里了需要代码的 戳我 ------

更多推荐

python网页爬虫菜鸟教程_Python 爬取菜鸟教程(www.runoob.com)内容。并保在本地(html格式/pdf格式)...