《Python网络数据采集》第三章(阅读代码笔记)

分享关于学习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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

象话

打赏犹如太阳穴的枪口

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值