当前访客身份:游客 [ 登录 | 申请入伍 ]

江西快3交流群|经验教程

当前位置:
江西快3开奖走势图 » 后援区 » 经验教程 » 主题内容
查看: 916|回复: 0
打印 上一主题 下一主题
收起左侧

Python爬虫包BeautifulSoup递归抓取实例有哪些-网站建设

[复制链接]

144

主题

144

帖子

90

积分

初入站场

Rank: 1

积分
90
跳转到指定楼层
楼主
佚名 发表于 2017-4-16 00:00:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文来源:http://www.piucs.com/a/rvxyf.foxnvc.cn/

江西快3开奖走势图 www.piucs.com,为此,智库的建设显得尤为重要,是一个国家软实力的建设。  除此之外,在我国,政府智库占多,而民间智库偏少。

爬虫的主要目的就是为了沿着网络抓取需要的内容。它们的本质是一种递归的过程。它们首先需要获得网页的内容,然后分析页面内容并找到另一个URL,然后获得这个URL的页面内容,不断重复这一个过程。
让我们以维基百科为一个例子。
我们想要将维基百科中凯文·贝肯词条里所有指向别的词条的链接提取出来。
# -*- coding: utf-8 -*-
# @Author: HaonanWu
# @Date: 2016-12-25 10:35:00
# @Last Modified by: HaonanWu
# @Last Modified time: 2016-12-25 10:52:26
from urllib2 import urlopen
from bs4 import BeautifulSoup
html = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon')
bsObj = BeautifulSoup(html, "html.parser")
for link in bsObj.findAll("a"):
if 'href' in link.attrs:
  print link.attrs['href']
上面这个代码能够将页面上的所有超链接都提取出来。
/wiki/Wikipedia:Protection_policy#semi
#mw-head
#p-search
/wiki/Kevin_Bacon_(disambiguation)
/wiki/File:Kevin_Bacon_SDCC_2014.jpg
/wiki/San_Diego_Comic-Con
/wiki/Philadelphia
/wiki/Pennsylvania
/wiki/Kyra_Sedgwick
首先,提取出来的URL可能会有一些重复的
其次,有一些URL是我们不需要的,如侧边栏、页眉、页脚、目录栏链接等等。
所以通过观察,我们可以发现所有指向词条页面的链接都有三个特点:
它们都在id是bodyContent的div标签里
URL链接不包含冒号
URL链接都是以/wiki/开头的相对路径(也会爬到完整的有http开头的绝对路径)
from urllib2 import urlopen
from bs4 import BeautifulSoup
import datetime
import random
import re
pages = set()
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"]
if newArticle not in pages:
  print(newArticle)
  pages.add(newArticle)
  links = getLinks(newArticle)
其中getLinks的参数是/wiki/,并通过和维基百科的绝对路径合并得到页面的URL。通过正则表达式捕获所有指向其他词条的URL,并返回给主函数。
主函数则通过调用递归getlinks并随机访问一条没有访问过的URL,直到没有了词条或者主动停止为止。
这份代码可以将整个维基百科都抓取下来
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("This page is missing something! No worries though!")
for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
  if 'href' in link.attrs:
   if link.attrs['href'] not in pages:
    #We have encountered a new page
    newPage = link.attrs['href']
    print("----------------\n"+newPage)
    pages.add(newPage)
    getLinks(newPage)
getLinks("")
一般来说Python的递归限制是1000次,所以需要人为地设置一个较大的递归计数器,或者用其他手段让代码在迭代1000次之后还能运行。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站友网手机客户端: Android iPhone WP7 QQ

© 站友网(江西快3开奖走势图 www.piucs.com)|关于我们|小黑屋| 闽ICP备09072999号  

快速回复 返回顶部 返回列表
吉林快3官方网站 安徽快3开走势图 河北快3选号技巧 北京快3公交线路 青海快3带跨度 青海快三下载
内蒙古快3形态一定牛 河南快3走势图一定牛 北京快3一定牛预测 江苏快3豹子规律 青海快3群 官方湖北快3走势图
福建快3形态走势图 吉林快3跨度走势图 上海快3开奖图 河北快3开 吉林快3网上购彩 燕赵风采河北快3走势图
广西快3三同号计划表 广东快乐十分开奖 新疆时时彩正规网 pk10助赢软件 广东11选5开奖依据
台湾幸运28预测 广东11选5精准预测 至尊棋牌大厅 辽宁福利彩票35选7 22选5预测