Python网路数据采集之HTML解析|第01天

优采云 发布时间: 2020-08-27 09:27

  Python网路数据采集之HTML解析|第01天

  User:你好我是森林

  Date:2018-03-29

  Mark:《Python网路数据采集》

  网络采集系列文章

  Python网路数据采集之创建爬虫

  Python网路数据采集之HTML解析

  开始采集

  网络爬虫是可以按照递归方法。为了找到URL 链接,它们必须首先获取网页内容,检查这个页面的内容,再找寻另一个 URL,然后获取 URL对应的网页内容,不断循环这一过程。

  遍历单个域名

  以抓取维基百科的Kevin Baco为例,实现简单的数据爬取。代码如下:

  from urllib.request import urlopen

from bs4 import BeautifulSoup

html = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon')

bs = BeautifulSoup(html, 'html.parser')

for link in bs.find_all('a'):

if 'href' in link.attrs:

print(link.attrs['href'])

  上述代码就获取维基百科网站的任何页面并提取页面链接。去掉我们不需要的词条,进行改进获取词条链接。代码如下:

  from urllib.request import urlopen

from bs4 import BeautifulSoup

import re

html = urlopen('http://en.wikipedia.org/wiki/Kevin_Bacon')

bs = BeautifulSoup(html, 'html.parser')

for link in bs.find('div', {'id':'bodyContent'}).find_all(

'a', href=re.compile('^(/wiki/)((?!:).)*$')):

if 'href' in link.attrs:

print(link.attrs['href'])

  如果我们要做到一个函数getLinks,可以用维基百科词条/wiki/方式的URL链接作为参数,然后以同样的方式返回一个列表,里面收录所有的词条 URL 链接。一个主函数,以某个起始词条为参数调用getLinks,再从返回的URL列表里随机选择一个词条链接,再调用 getLinks,直到我们主动停止,或者在新的页面上没有词条链接了,程序才停止运行。

  完善后代码如下:

  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{}'.format(articleUrl))

bs = BeautifulSoup(html, 'html.parser')

return bs.find('div', {'id':'bodyContent'}).find_all('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)

  遍历整个网路

  采集整个网站,那是十分花费显存资源的过程,尤其是处理小型网站时,最合适的工具就是用一个数据库来存储采集的资源。

  遍历整个网路的数据益处:可以生产网站地图,采集网站数据等。但是通常不会消耗大量的显存资源去做采集,本节的意义不大。

  通过互联网采集

  建立网路地图,需要从一个链接跳转到另一个链接,逐步完善网站的地图信息,从而达到一个合适的网站地图,于此同时我们也不能忽视外链,从一个链接跳转到另一个链接的场景也会时有发生。相比之前的单域名采集,互联网采集的难度要高好多,所以,要求我们的找寻信息的方法和采集信息的方法都应当极具灵活性,以此达到理想的采集效果。

  在做数据采集之前最好才能确定自己采集的内容,明确目标,然后按照目标的展示方式去剖析,该网站是否会跳转其他的链接,是否须要继续采集等各个诱因。

  如果采集一个网站,有时候也会考虑到网路重定向的问题,例如我的个人博客原先链接是:,但是我做了一个网路的重定向,我将,重定向到原先的链接,这样无论是访问哪一个链接其本质都跳转到原先的链接,此时须要了解的是网路重定向的时侯,我们采集的URL地址会发生变化,在Python3.X的版本中,我们的urllib会帮我完成重定向的功能。

  用Scrapy采集

  Scrapy就是一个可以大幅度增加我们对网页链接查找和辨识工作复杂度的Python 库,它可以使你轻松地采集一个或多个域名的信息。

  利用Scrapy进行爬虫项目还是有一些设置,我们可以采用官网下载,也可以采用pip进行安装,检验安装的方式在之前的Python基础系列的文章有提及过。这里不做过多的探讨。

  创建一个项目:

  ➜ python scrapy startproject demourl

New Scrapy project 'demourl', using template directory '/usr/local/lib/python3.6/site-packages/scrapy/templates/project', created in:

/Users/demo/Project/python/demourl

You can start your first spider with:

cd demourl

scrapy genspider example example.com

  我们查看一下目录结构:

  ➜ demourl tree ./

./

├── [drwxr-xr-x] demourl

│ ├── [-rw-r--r--] __init__.py

│ ├── [drwxr-xr-x] __pycache__

│ ├── [-rw-r--r--] items.py

│ ├── [-rw-r--r--] middlewares.py

│ ├── [-rw-r--r--] pipelines.py

│ ├── [-rw-r--r--] settings.py

│ └── [drwxr-xr-x] spiders

│ ├── [-rw-r--r--] __init__.py

│ └── [drwxr-xr-x] __pycache__

└── [-rw-r--r--] scrapy.cfg

4 directories, 7 files

  关于Scrapy的内容我们后续逐一介绍,大家可以点击关注,及时收到后续更新。

  博客原文链接:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线