人生不得已——Python爬虫 链接爬虫
2018-11-03 本文已影响11人
阿猫阿狗py
链接爬虫
模拟用户点击链接,下载页面。
特点:只要足够耐心,可以下载到整个网站的所有页面。
缺点:会下载很多无用页面,如果有外链,可能会爬到网站外部。
正则,将非常有用。
import urllib.request
import urllib.parse
import re
def download(url, headers={}, retryCount=5):
"""
下载页面
:param url: 要下载的链接
:param headers: 伪造头
:param retryCount: 如果是服务器错误,需要尝试的次数
:return:
"""
print('download to '+ url)
# 请求头对象
request = urllib.request.Request(url, headers=headers)
try:
# 返回数据
response = urllib.request.urlopen(request)
except urllib.error.URLError as e:
# 判断是否为服务器错误
if hasattr(e, 'code') and 500 <= e.code < 600:
# 重试几次
if retryCount > 0:
return download(url, headers, retryCount-1)
# 最终下载失败
return None
return response.read()
def get_link(html):
"""
得到页面中的链接
:param html: 页面数据
:return: 返回链接列表
"""
webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
return webpage_regex.findall(html)
def link_spider(start_link, link_regex):
"""
链接爬虫函数
:param start_link: 开始下载的链接
:param link_regex: 需要的部分链接
:return:
"""
# 等待下载的链接的列表
wait_download_link = [start_link]
# 定义一个集合,用来过滤掉重复的链接
crawled_link = set()
while wait_download_link:
# 从所有等待下载的连接列表中弹出一个链接
url = wait_download_link.pop()
# 解析链接
urlObj = urllib.parse.urlparse(url)
# 下载url链接的页面
html = download(url)
# 如果页面为空,则跳出本次循环重新开始
if html is None:
continue
# 将下载过的链接放入已经下载过的链接集合中
crawled_link.add(url)
# 利用正则表达式筛选出页面所有的链接,编码视情况而定
all_link = get_link(html.decode('utf-8'))
# 遍历链接
for link in all_link:
# 筛选出自己需要的链接
if re.match(link_regex, link):
# 得到完整的有用链接
realUrl = urlObj.scheme + '://' + urlObj.netloc + link
# 判断链接是否已经下载过
if realUrl not in crawled_link:
wait_download_link.append(realUrl)
link_spider('http://127.0.0.1:8080/places/default/index', '/places/default/view/|/places/default/index/')