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

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网络数据采集》——第三天)