学了两节课的 Python 爬虫,也算是入门了吧。敲了两天的案例代码之后,我突然发现,这些代码虽然功能不同,写法各异,但是终归是有章可循的,整体框架是一致的。所以我自己整理了一个简单的爬虫框架,适合初学者学习时参考。
import urllib.request
import urllib.parse
import urllib.error
def loadPage(url):
'''
Function: Fetching url and accessing the webpage content
url: the wanted webpage url
'''
headers = {
'Accept': 'text/html',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
print('To send HTTP request to %s ' % url)
try:
request = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(request) as response:
return response.read().decode('utf-8')
except urllib.error.URLError as e:
print(e)
except urllib.error.HTTPError as e:
print(e)
print(e.headers)
except:
print('Unknown error')
def writePage(html, filename):
'''
Function : 将 html 页面保存至本地 filename 文件中
html : 网页内容
filename : 将要保存至的本地文件名
'''
print('To write html into a local file %s ...' % filename)
try:
with open(filename, 'w', encoding='utf-8') as f:
f.write(str(html))
print('Work done!')
print('---'*10)
except:
print("Error on writing page!")
def crawlerManager(url):
'''
功能: 爬虫调度程序,用于获取所有需要的 url 并依次访问(不过具体怎么获取需要自己写代码去实现)
url: 初始的 URL,以它为起点获取所有需要的 url。
通过 loadPage 获取网页内容,然后通过 writePage 将其保存至本地文件
'''
filename = 'CrawlerTest_tieba.html' # 本地保存的文件名,命名规则自己定
page = loadPage(url) # 访问 url 并将页面返回
writePage(page, filename) # 将返回的页面保存在本地
if __name__ == '__main__':
# 主函数,输入 url (初始的 URL)
url = 'http://tieba.baidu.com/' # 以百度贴吧为例
# 爬虫控制器,参数是 初始URL。
crawlerManager(url)
运行结果:
To send HTTP request to http://tieba.baidu.com/
To write html into a local file CrawlerTest_tieba.html ...
Work done!
------------------------------
给代码做一个简单的使用说明
没错,这就是在上次作业【从百度贴吧下载多页话题内容】的代码基础上修改的,添加了异常捕获的功能,这样,我们的代码就没有那么容易崩溃了。
使用时,只需要在 main 函数中填入初始的 url,然后启动爬虫调度程序 crawlerManager。
如果自己已经分析出目标url的组成结构,那么可以在 crawlerManager 中写一个循环,类似于【从百度贴吧下载多页话题内容】那样。
如果是希望从网页内容中提取新的 url,则可以准备一个列表,在获取网页内容时提取其中的url存入列表,然后循环访问列表中的url即可。
然后是 loadPage 函数,作用是解析url,返回网页内容,目前是将所有内容全部返回,将来可以在此基础上加一个解析的过程,提取并返回其中的关键信息。
writePage 函数是将内容保存至本地,需要两个参数,内容和文件名。没什么好讲的。
目前水平有限,只能做到这个地步了,还有其他什么骚操作,等以后学会了再加吧!