分享关于学习Python,跟着书籍敲的代码。
第一本书:《Byte Of Python》,给出代码笔记链接:ByteOfPython笔记代码,链接中有此书的PDF格式资源。
第二本书:《Python网络数据采集》,给出此书PDF格式的资源链接:https://pan.baidu.com/s/1eSq6x5g 密码:a46q
此篇给出《Python网络数据采集》第三章:开始采集 的代码笔记,供大家参考。
第三章 开始采集
#-*-coding:utf-8-*-
from urllib.error import HTTPError, URLError
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import datetime
import random
# sys.setdefaultencoding('utf-8')
####遍历单个域名,(随机从一个网页跳转到另外一个网页)
###第一版
# beginUrl=urlopen("https://en.wikipedia.org/wiki/Eric_Idle")
# bsBeginUrl=BeautifulSoup(beginUrl)
# for link in bsBeginUrl.findAll("a"):
# if "href" in link.attrs:
# print(link.attrs["href"])
###第二版
# 它们都有三个共同点:
# • 它们都在 id 是 bodyContent 的 div 标签里
# • URL 链接不包含分号
# • URL 链接都以 /wiki/ 开头
# beginUrl=urlopen("https://en.wikipedia.org/wiki/Eric_Idle")
# bsBeginUrl=BeautifulSoup(beginUrl)
#
# for link in bsBeginUrl.find("div",{"id":"bodyContent"}).findAll("a",href=re.compile("^(/wiki/)((?!:).)*$")):
# if("href" in link.attrs):
# print(link["href"])
###第三版
# • 一个函数 getLinks,可以用维基百科词条 /wiki/< 词条名称 > 形式的 URL 链接作为参数,
# 然后以同样的形式返回一个列表,里面包含所有的词条 URL 链接。
# • 一个主函数, 以某个起始词条为参数调用 getLinks,再从返回的 URL 列表里随机选择
# 一个词条链接,再调用 getLinks,直到我们主动停止,或者在新的页面上没有词条链接
# 了,程序才停止运行。
# import random
# import datetime
# def getLinks(url):
# links=[]
# bshtml=BeautifulSoup(urlopen("https://en.wikipedia.org{0}".format(url)))
# return bshtml.find("div",{"id":"bodyContent"}).findAll("a",href=re.compile("^(/wiki/)((?!:).)*$"))
# links=getLinks("/wiki/Kevin_Bacon")
# while len(links)>0:
# href=links[random.randint(0,len(links)-1)].attrs["href"]
# print(href)
# links=getLinks(href)
###采集整个网站的地址
# pages=set()
#
# def getLinks(url):
# global pages
# try:
# bshtml=BeautifulSoup(urlopen("http://en.wikipedia.org{0}".format(url)),"html.parser")
# except HTTPError:
# print("找不到这个网页!")
# else:
# for link in bshtml.findAll("a",href=re.compile("^(/wiki/)")):
# if("href" in link.attrs):
# if(link.attrs["href"] not in pages):
# newpage=link.attrs["href"]
# print("第{0}页面:{1}".format(len(pages)+1,newpage))
# pages.add(newpage)
# getLinks(newpage)
#
#
# getLinks('')
# print("全站的页面数量:{0}".format(len(pages)))
###收集整个网站的特定内容数据
# pages=set()
# def getLinks(url):
# global pages
# try:
# bshtml = BeautifulSoup(urlopen("http://en.wikipedia.org{0}".format(url)), "html.parser")
# # print("第{0}页面:{1}".format(len(pages)+1,url))
# print(bshtml.h1.get_text())
# print(bshtml.find(id="mw-content-text").findAll("p")[0])
# print(bshtml.find(id="ca-edit").find("span").find("a").attrs['href'])
# except HTTPError:
# print("404:找不到这个网页(http://en.wikipedia.org{0})!".format(url))
# except AttributeError:
# print("页面缺少这个元素")
# except IndexError:
# print("角标越界")
# except URLError:
# print("没反应")
# for link in bshtml.findAll("a",href=re.compile("^(/wiki/)")):
# if("href" in link.attrs):
# if link.attrs["href"] not in pages:
# newpage=link.attrs["href"]
# print("--------------------\n第{0}网页:{1}".format(len(pages)+1,newpage))
# pages.add(newpage)
# getLinks(newpage)
#
# getLinks('')
###采集互联网。不再在一个特定的网站内采集数据,而是跨网站。
pages=set()
##获取内链
def getInternalLinks(bshtml,includeUrl):
internalLinks=[]
#找出所有以“/”开头的链接
for link in bshtml.findAll("a",href=re.compile("^(/|.*"+includeUrl+")")):
if link.attrs["href"] is not None:
if link.attrs["href"] not in internalLinks:
internalLinks.append(link.attrs["href"])
return internalLinks
##获取外链
def getExternalLinks(bshtml,excliudeUrl):
externalLinks=[]
#找出所有以“www”或者“http”开头且不包含当前URL的的链接
for link in bshtml.findAll("a", href=re.compile("^(www|http)((?!"+excliudeUrl+").)*$")):
if link.attrs["href"] is not None:
if link.attrs["href"] not in externalLinks:
externalLinks.append(link.attrs["href"])
return externalLinks
def splitAddress(address):
addressPart=address.replace("http://","").split("/")
return addressPart
def getRandomExternalLink(startingPage):
html=urlopen(startingPage)
bshtml=BeautifulSoup(html,"html.parser")
externalLinks=getExternalLinks(bshtml,splitAddress(startingPage)[0])
if len(externalLinks)==0:
internalLinks=getInternalLinks(startingPage)
return getRandomExternalLink(internalLinks[random.randint(0,len(internalLinks)-1)])
else:
return externalLinks[random.randint(0,len(externalLinks)-1)]
def followExternalOnly(startingSite):
externalLink = getRandomExternalLink("http://oreilly.com")
print("随机外链是:"+externalLink)
followExternalOnly(externalLink)
# followExternalOnly("http://oreilly.com")
# print(splitAddress("http://oreilly.com"))
####收集网站的所有外链链接
#
# allExtLinks=[]
# allIntLinks=[]
#
# def getAllExtLinks(url):
# html=urlopen(url)
# bshtml=BeautifulSoup(html,"html.parser")
# internalLinks =getInternalLinks(bshtml,splitAddress(url)[0])
# externalLinks =getExternalLinks(bshtml,splitAddress(url)[0])
#
# for link in externalLinks:
# if link not in allExtLinks:
# allExtLinks.append(link)
# print("第{0}外链:{1}".format(len(allExtLinks)+1,link))
#
# for link in internalLinks:
# if link not in allIntLinks:
# allIntLinks.append(link)
# getAllExtLinks(link)
#
# getAllExtLinks("http://oreilly.com")
给出第四章:
使用API