美文网首页python爬虫Pythoner集中营Python精选
《python网络数据采集》——第三天

《python网络数据采集》——第三天

作者: 三横一竖是我 | 来源:发表于2018-07-17 23:03 被阅读7次

    7-17

    维基百科六度分割理论

    也就是我们常说的小世界现象,两个不相认识的人,通过很少的中间人就能建立起联系
    指向词条页面的链接有三个共同点1.他们都在id是bodycontent的div标签里2.URL链接不包含分号3.url链接都是以/wiki/开头
    接下来就是利用起始页面里的词条链接列表设置成链接列表,在利用循环,页面找一个词条抽取herf属性,打印页面链接,再传入getlink函数,重新获取链接

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import datetime
    import random
    import re
    random.seed(datetime.datetime.now())
    def getLinks(articleUrl):
        html = urlopen("http://en.wikipedia.org"+articleUrl)
        bsObj = BeautifulSoup(html,"html.parser")
        return bsObj.find("div", {"id":"bodyContent"}).findAll("a",
    href=re.compile("^(/wiki/)((?!:).)*$"))
    links = getLinks("/wiki/Kevin_Bacon")
    while len(links) > 0:
        newArticle = links[random.randint(0, len(links)-1)].attrs["href"]
        print(newArticle)
        links = getLinks(newArticle)
    

    datatime模块分析

    datetime模块定义了5个类,分别是
    1.datetime.date:表示日期的类
    2.datetime.datetime:表示日期时间的类
    3.datetime.time:表示时间的类
    4.datetime.timedelta:表示时间间隔,即两个时间点的间隔
    5.datetime.tzinfo:时区的相关信息
    其实也就是时间信息https://www.cnblogs.com/cindy-cindy/p/6720196.html

    re模块分析

    re就是正则表达式
    “有些人面临一个问题时会想:‘我知道,可以用正则表达式来解决这个问题。’于是现在他们就有两个问题了”——Jamie Zawinski(看到的一句话很赞同哈哈哈)
    re模块中包含一个重要函数是compile(pattern [, flags]) ,该函数根据包含的正则表达式的字符串创建模式对象。可以实现更有效率的匹配。在直接使用字符串表示的正则表达式进行search,match和findall操作时,python会将字符串转换为正则表达式对象。而使用compile完成一次转换之后,在每次使用模式的时候就不用重复转换。当然,使用re.compile()函数进行转换后,re.search(pattern, string)的调用方式就转换为 pattern.search(string)的调用方式。所以说compile就是增加匹配速度
    https://www.jianshu.com/p/eb87f02a7e34

    random

    程序最开始首先是利用系统时间做一个随机数,保证每次程序运行时,wiki词条选择是随机的

    链接去重

    在代码运行时,把已发现的链接保存起来,在方便查询的列表里(python集合的set类型),只有新的链接才会被采集

    pages = set()
    def getLinks(pageUrl):
        global pages#全局变量
        html = urlopen("http://en.wikipedia.org"+pageUrl)
        bsObj = BeautifulSoup(html)
        for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
            if 'href' in link.attrs:
            if link.attrs['href'] not in pages:
                # 我们遇到了新页面
                newPage = link.attrs['href']
                print(newPage)
                pages.add(newPage)
                getLinks(newPage)
    getLinks("")
    

    收集网站数据

    要拟定一个采集模式,所有的标题都是在h1→span标签里,而且页面上只有一个h1
    所有的正文都在div#mw-content-text→p,编辑链接只出现在词条页面上,位于li#ca-edit标签的li#ca-edit→span→a里面

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import re
    pages = set()
    def getLinks(pageUrl):
        global pages
        html = urlopen("http://en.wikipedia.org"+pageUrl)
        bsObj = BeautifulSoup(html,"html.parser")
        try:
            print(bsObj.h1.get_text())
            print(bsObj.find(id="mw-content-text").findAll("p")[0])
            print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href'])
        except AttributeError:
            print("页面缺少一些属性!不过不用担心!")
        for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
            if 'href' in link.attrs:
                if link.attrs['href'] not in pages:
                    # 我们遇到了新页面
                    newPage = link.attrs['href']
                    print("----------------\n"+newPage)
                    pages.add(newPage)
                    getLinks(newPage)
    getLinks("")
    

    最后一个是用getlink处理空的url,也就是维基百科首页。

    收集内链外链

    网站首页上并不能保证一直发现外链,所以没有外链的时候,进入网页的一个内链,继续https://blog.csdn.net/hw140701/article/details/56009019

    scrape库

    scrape是一个降低网页链接查找和识别工作复杂度的库,但是因为scrape目前仅支持python2.7,所以先不实践
    scrape爬虫需要先进行一些设置https://www.jianshu.com/p/be856bc15afb先码住

    相关文章

      网友评论

        本文标题:《python网络数据采集》——第三天

        本文链接:https://www.haomeiwen.com/subject/erzwpftx.html