Python网络数据采集之开始采集|第02天

User:你好我是森林 Date:2018-03-29 Mark:《Python网络数据采集》 原文:https://chensenlin.cn/posts/38026/

网络采集系列文章

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)

遍历整个网络

采集整个网站,那是非常耗费内存资源的过程,尤其是处理大型网站时,最合适的工具就是用一个数据库来储存采集的资源。

遍历整个网络的数据好处:可以生产网站地图,收集网站数据等。但是一般不会消耗大量的内存资源去做采集,本节的意义不大。

通过互联网采集

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

在做数据采集之前最好能够确定自己采集的内容,明确目标,然后根据目标的展示形式去分析,该网站是否会跳转其他的链接,是否需要继续采集等各个因素。

如果采集一个网站,有时候也会考虑到网络重定向的问题,例如我的个人博客原来链接是:https://forestfdemo.github.io,但是我做了一个网络的重定向,我将https://chensenlin.cn,重定向到原来的链接,这样无论是访问哪一个链接其本质都跳转到原来的链接,此时需要了解的是网络重定向的时候,我们采集的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的内容我们后续逐一介绍,大家可以点击关注,及时收到后续更新。

欢迎你免费加入我的星球,一起分享,共同成长。

知识星球

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

沃趣科技火线救援某公安系统核心业务数据

求助电话 只剩下键盘敲打声的办公室,被一个突如其来的电话打破了宁静。电话那头,是某公安客户的紧急求助。 案发现场 其核心数据库,由于存储突然断电,导致数据库实例...

3607
来自专栏施炯的IoT开发专栏

Windows 10 IoT Serials 9 – 如何利用IoTCoreAudioControlTool改变设备的音频设备

    大家知道,在Windows 10 IoT Core上,如果用户外接了USB声卡、带有麦克风的摄像头之类的硬件,就会有多个音频设备可以用。但是,系统目前并...

2089
来自专栏程序员互动联盟

FFMPEG在嵌入式硬件上应用之——基本环境搭建及编译

这篇文章是以前工作的一些实际经验总结,这里给大家分享一下,顺便做了一下记录以备以后使用时参考,本文(记录)与目前网上很多关于ffmpeg的文章相比有两个特点: ...

3497
来自专栏程序员八阿哥

王老板Python面试(1):HTTP中GET与POST的区别?

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。

1141
来自专栏杨建荣的学习笔记

datapump跨平台升级迁移的对比测试和优化 (r8笔记第81天)

目前计划对跨平台的数据库环境进行迁移,一来降低运维成本,二来更加可控。其实对于很多机器来说,如果机器跑了很多年,一直没有重启过,那么时间长了,一 个直...

36911
来自专栏deed博客

权限何必那么高

1864
来自专栏网站漏洞修补

公司网站被黑了跳转到彩票、博彩网站怎么处理?

最近一段时间,我们SINE安全公司一连接到数十个公司网站被跳转到彩票,博彩网站上去,客户反映从百度搜索网站进去,直接跳转到彩票网站上,直接输入网址没有跳转,导致...

1.7K5
来自专栏腾讯Bugly的专栏

Android 插件技术实战总结

前言 安卓应用开发的大量难题,其实最后都需要插件技术去解决。 现今插件技术的使用非常普遍,比如微信、QQ、淘宝、天猫、空间、携程、大众点评、手机管家等等这些大家...

3856
来自专栏华章科技

如何用 Python 打造一个聊天机器人?

不知道玩Slack的人多不多?国内有一个类似的产品,之前搞PythonTG翻译组在用,但是没怎么用起来。感觉这些产品提供的灵活性还蛮大的,可以自己实现许多有意思...

1095
来自专栏腾讯Bugly的专栏

《手Q Android线程死锁监控与自动化分析实践》

手Q每个版本上线以后研发同学都会收到各种问题反馈。在跟进手Q内部用户反馈的问题时,发现多例问题,其表象和原因如下:

9948

扫码关注云+社区

领取腾讯云代金券