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

【《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=https://www.it610.com/article/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=https://www.it610.com/article/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=https://www.it610.com/article/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先码住

    推荐阅读