Python爬虫小实践:获取某个网站所有的外部链接以及内部链接
我们在进行爬虫时有的时候不可能只是在一个网站上进行内容上的爬取,理想中的爬虫应该是顺着一个链接从一个页面到另外一个页面,这需要获取页面上的所有的外链,同时收集每个页面上的内链。网站首页上不一定会发现外链,为了防止程序出错,就要递归深入到一个网站直到找到一个外链为止。
但在爬取的过程中出现了TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。这个错误。
可能是由于访问网站频率过快,或者是我处于校园网,访问过快,被学校的服务的给限制了,或者是网速不好。所以在网上百度了下,设置了代理IP,结果完美运行,没有出现这个原因,最新的代理IP,自行百度即可。
附上代码:
#__author__ = 'Administrat
#coding=utf-8
from urllib.request import urlopen
from urllib.parse import urlparse
from bs4 import BeautifulSoup
import re
import datetime
import random
import io
import os
import sys
from urllib import request
import 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).netlocinternalLinks = []#找出所有以“/”开头的链接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).netlocinternalLinks = 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).netlocinternalLinks = 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/")
结果:
获取这些所有的外部链接之后,可以自行设置爬取某个页面上的什么东西,哈哈。
如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com,更多博文干货等着您。
Python爬虫小实践:获取某个网站所有的外部链接以及内部链接相关推荐
- Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量...
Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处. 这两天闲 ...
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库...
前两天有人私信我,让我爬这个网站,http://bbs.baobeihuijia.com/f...上的失踪儿童信息,准备根据失踪儿童的失踪时的地理位置来更好的寻找失踪儿童,这种事情本就应该义不容辞,如 ...
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库... 1
前两天有人私信我,让我爬这个网站,http://bbs.baobeihuijia.com/forum-191-1.html上的失踪儿童信息,准备根据失踪儿童的失踪时的地理位置来更好的寻找失踪儿童,这种 ...
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库
前两天有人私信我,让我爬这个网站,http://bbs.baobeihuijia.com/f...上的失踪儿童信息,准备根据失踪儿童的失踪时的地理位置来更好的寻找失踪儿童,这种事情本就应该义不容辞,如 ...
- Python爬虫小实践:使用BeautifulSoup+Request爬取CSDN博客的个人基本信息
好久都没有动Python了,自从在网上买了<Python网络数据采集>这本书之后一直没有时间写自己的小的Demo,今天再网络上无意中看见 http://www.cnblogs.com/mf ...
- Python爬虫项目,获取所有网站上的新闻,并保存到数据库中,解析html网页等(未完待续)
1.需求说明 需求: 爬取虎嗅网站的所有新闻,并保存到数据库中. http://www.huxiu.com 技术: 1.爬虫 获取服务器的资源(urllib) 解析html网页(BeautifulSo ...
- 某徒步旅游网站python爬虫小练习
yxk周边游网站python爬虫小练习(跨页面) 代码很简单,关键一个是 encoding="utf_8_sig" , 否则乱码,注意writerow()处理list import ...
- Python爬虫实战爬取租房网站2w+数据-链家上海区域信息(超详细)
Python爬虫实战爬取租房网站-链家上海区域信息(过程超详细) 内容可能有点啰嗦 大佬们请见谅 后面会贴代码 带火们有需求的话就用吧 正好这几天做的实验报告就直接拿过来了,我想后面应该会有人用的到吧 ...
- Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)
Python爬虫抓取某音乐网站MP3(下载歌曲.存入Sqlite) 最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分 ...
最新文章
- 批量更新zabbix中的主机名
- linux基础Samba服务和nginx服务
- java websocket 客户端
- IDC预测2014年9个趋势
- 华为在中国建立其全球最大的网络安全透明中心
- 能不能在FOR循环中执行SQL?
- [Web 前端] MobX
- matlab动态显示鼠标值,动态显示鼠标的坐标值和像素值
- 打造炫酷通用的ViewPager指示器 玩转字体变色
- matlab画图函数双精度,Matlab中图像函数大全2_matlab函数大全
- 一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)
- Js 中实现重定向的几种方式
- 常用的公共数据集(一)
- 怎样自动关闭计算机,如何设置电脑自动关机,教您电脑怎样设置自动关机
- COGS 1008 贪婪大陆
- 特么,冒泡排序有这么难?
- 设计模式之简单化_Mediator中介者模式_只有一个仲裁者
- Code First开发系列之管理并发和事务
- 深度学习框架之paddlepaddle
- Hadoop Notes I