最近在开始学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 就写到这里了需要代码的 戳我 ------