Python爬虫小实践:获取某个网站所有的外部链接以及内部链接
来源:互联网 发布:linux 文件权限 rwx 编辑:程序博客网 时间:2024/06/03 18:43
我们在进行爬虫时有的时候不可能只是在一个网站上进行内容上的爬取,理想中的爬虫应该是顺着一个链接从一个页面到另外一个页面,这需要获取页面上的所有的外链,同时收集每个页面上的内链。网站首页上不一定会发现外链,为了防止程序出错,就要递归深入到一个网站直到找到一个外链为止。
但在爬取的过程中出现了TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。这个错误。
可能是由于访问网站频率过快,或者是我处于校园网,访问过快,被学校的服务的给限制了,或者是网速不好。所以在网上百度了下,设置了代理IP,结果完美运行,没有出现这个原因,最新的代理IP,自行百度即可。
附上代码:
#__author__ = 'Administrat#coding=utf-8from urllib.request import urlopenfrom urllib.parse import urlparsefrom bs4 import BeautifulSoupimport reimport datetimeimport randomimport ioimport osimport sysfrom urllib import requestimport urllibpages = set()random.seed(datetime.datetime.now())sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}#获取页面所有内链的列表def getInternalLinks(bsObj, includeUrl): includeUrl = urlparse(includeUrl).scheme+"://"+urlparse(includeUrl).netloc internalLinks = [] #找出所有以“/”开头的链接 for link in bsObj.findAll("a", href=re.compile("^(/|.*"+includeUrl+")")): if link.attrs['href'] is not None: if link.attrs['href'] not in internalLinks: if(link.attrs['href'].startswith("/")): internalLinks.append(includeUrl+link.attrs['href']) else: internalLinks.append(link.attrs['href']) return internalLinks#获取页面所有外链的列表def getExternalLinks(bsObj, excludeUrl): externalLinks = [] #找出所有以“http”或者“www”开头且不包含当前URL的链接 for link in bsObj.findAll("a", href=re.compile("^(http|www)((?!"+excludeUrl+").)*$")): if link.attrs['href'] is not None: if link.attrs['href'] not in externalLinks: externalLinks.append(link.attrs['href']) return externalLinksdef getRandomExternalLink(startingPage): req=request.Request(startingPage,headers=headers) html=urlopen(req) bsObj=BeautifulSoup(html.read(),"html.parser") externalLinks = getExternalLinks(bsObj, urlparse(startingPage).netloc) if len(externalLinks) == 0: print("没有外部链接,准备遍历整个网站") domain = urlparse(startingPage).scheme+"://"+urlparse(startingPage).netloc internalLinks = getInternalLinks(bsObj, domain) return getRandomExternalLink(internalLinks[random.randint(0,len(internalLinks)-1)]) else: return externalLinks[random.randint(0, len(externalLinks)-1)]def followExternalOnly(startingSite): externalLink = getRandomExternalLink(startingSite) print("随机外链是: "+externalLink) followExternalOnly(externalLink)#收集网站上发现的所有外链列表allExtLinks = set()allIntLinks = set()def getAllExternalLinks(siteUrl): #设置代理IP访问 proxy_handler=urllib.request.ProxyHandler({'http':'183.77.250.45:3128'}) proxy_auth_handler=urllib.request.ProxyBasicAuthHandler() #proxy_auth_handler.add_password('realm', '123.123.2123.123', 'user', 'password') opener = urllib.request.build_opener(urllib.request.HTTPHandler, proxy_handler) urllib.request.install_opener(opener) req=request.Request(siteUrl,headers=headers) html=urlopen(req) bsObj=BeautifulSoup(html.read(),"html.parser") domain = urlparse(siteUrl).scheme+"://"+urlparse(siteUrl).netloc internalLinks = getInternalLinks(bsObj,domain) externalLinks = getExternalLinks(bsObj,domain) #收集外链 for link in externalLinks: if link not in allExtLinks: allExtLinks.add(link) #print(link) print("即将获取的外部链接的URL是:"+link) #收集内链 for link in internalLinks: if link not in allIntLinks: print("即将获取内部链接的URL是:"+link) allIntLinks.add(link) getAllExternalLinks(link)#followExternalOnly("http://bbs.3s001.com/forum-36-1.html")#allIntLinks.add("http://bbs.3s001.com/forum-36-1.html")getAllExternalLinks("http://wangyou.pcgames.com.cn/zhuanti/lol/")
结果:
获取这些所有的外部链接之后,可以自行设置爬取某个页面上的什么东西,哈哈。
0 0
- Python爬虫小实践:获取某个网站所有的外部链接以及内部链接
- Python 爬虫笔记(获取整个站点中的所有外部链接)
- delphi 获取某个页面所有的链接
- delphi 获取某个页面所有的链接
- 内部链接与外部链接
- 内部链接和外部链接
- c++ 内部链接 外部链接
- 内部链接与外部链接
- 内部链接与外部链接
- c++ 内部链接 外部链接
- 外部链接与内部链接
- 内部链接与外部链接
- 内部链接和外部链接
- 内部链接和外部链接
- Python爬虫获取POJ某个用户的所有提交状态
- 网站的外部链接建设
- 链接之外部链接与内部链接
- SEO优化的内部链接和外部链接策略
- petri网初步
- Spring4的开发(第三天)
- Laravel5.2目录结构及composer.json文件解析
- http 错误代码表
- MySQL索引背后的数据结构及算法原理
- Python爬虫小实践:获取某个网站所有的外部链接以及内部链接
- 收获:如何对github中的个人博客进行备份
- 浅谈多线程和断点续传
- 大数据分析与处理
- PAT A1104. Sum of Number Segments (20)
- 【gc】java 垃圾回收基础
- Retrofit2.0使用详解
- 在链表中使用头结点与尾指针
- django部署admin后台static文件丢失问题解决