python爬虫入门——初步采集

#获取维基百科网站的任何页面并提取页面链接 
import urllib2
import bs4

html = urllib2.urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
bsObj = bs4.BeautifulSoup(html.read(), "lxml")
for link in bsObj.find("a"):
    if 'href' in link.attrs:
        print(link.attrs['href'])

以上代码问题:存在不需要的链接,如侧边栏、页眉、页脚的各种链接。
所需要链接的特点:

 
 
  • 它们都在idbodyContentdiv标签里

  • URL 链接不包含分号

  • URL 链接都以 /wiki/ 开头 

所以利用正则表达式进行筛选,改进版:
import urllib2
import bs4
import re

html = urllib2.urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")
bsObj = bs4.BeautifulSoup(html.read(), "lxml")

#利用正则表达式筛选出了不必要的链接
for link in bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$")):
    if 'href' in link.attrs:
        print(link.attrs['href'])

继续改进:

  
  
  • 一个函数getLinks,可以用维基百科词条/wiki/<词条名称>形式的URL链接作为参数,然后以同样的形式返回一个列表,里面包含所有的词条 URL 链接。

  • 一个主函数,以某个起始词条为参数调用getLinks,再从返回的URL列表里随机选择一个词条链接,再调用 getLinks,直到我们主动停止,或者在新的页面上没有词条链接了,程序才停止运行。 

import urllib2
import bs4
import re
import datetime
import random

random.seed(datetime.datetime.now())
def getLinks(articleUrl):
    html = urllib2.urlopen("http://en.wikipedia.org"+articleUrl)
    bsObj = bs4.BeautifulSoup(html.read(), "lxml")
    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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值