随着人工智能、大数据及大数据分析等逐渐成为热门,随着chatgpt的全球爆火,所有人都逐渐认识到,掌握数据就掌握未来发展的方向。而爬虫作为能够快速获取大量互联网数据的一种技术手段,也成为企业需求量非常大的岗位之一。python因为丰富的外部框架和全面的功能,成为爬虫开发的不二首选。一般情况下小型的爬虫需求直接使用request库+BS4就可以解决了。稍微复杂一点的可以使用selenium解决JS的异步加载问题。而如果遇到大型的爬虫需求,则需要考虑使用框架了。

常用框架

1.Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

2.PySpider

PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。

3.Crawley

Crawley可以高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。

4.Portia

Portia是一个开源可视化爬虫工具,可让您在不需要任何编程知识的情况下爬取网站!简单地注释您感兴趣的页面,Portia将创建一个蜘蛛来从类似的页面提取数据。

5.Newspaper

Newspaper可以用来提取新闻、文章和内容分析。使用多线程,支持10多种语言等。作者从requests库的简洁与强大得到灵感,使用python开发的可用于提取文章内容的程序。支持10多种语言并且所有的都是unicode编码。

6.Beautiful Soup

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup会帮你节省数小时甚至数天的工作时间。这个我是使用的特别频繁的。在获取html元素,都是bs4完成的。

7.Grab

Grab是一个用于构建Web刮板的Python框架。借助Grab,您可以构建各种复杂的网页抓取工具,从简单的5行脚本到处理数百万个网页的复杂异步网站抓取工具。Grab提供一个API用于执行网络请求和处理接收到的内容,例如与HTML文档的DOM树进行交互。

8.Cola

Cola是一个分布式的爬虫框架,对于用户来说,只需编写几个特定的函数,而无需关注分布式运行的细节。任务会自动分配到多台机器上,整个过程对用户是透明的。

9.selenium

Selenium 是自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果在这些浏览器里面安装一个 Selenium 的插件,可以方便地实现Web界面的测试. Selenium 支持浏览器驱动。Selenium支持多种语言开发,比如 Java,C,Ruby等等,PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Python 的对接,Python 进行后期的处理。

10 .Python-goose框架

Python-goose框架可提取的信息包括:文章主体内容;文章主要图片;文章中嵌入的任何Youtube/Vimeo视频;元描述;元标签。

什么是爬虫

爬虫是一种自动化程序,通过网络协议来获取特定网站的信息,例如图片、文字、视频等等。可以是公开数据,也可以是需要用户授权的私有数据。通过数据的自动下载和处理,可以轻易地获取大规模数据,从而进行各种分析和挖掘。

爬虫的一般流程

  1. 定义目标网站
  2. 发送http请求并获取相应网页源码(html源代码)
  3. 解析相应数据
  4. 存储数据

写一个简单的爬虫

scrapy等爬虫类框架或库直接带有各种成熟的模块,可以用非常少的代码写出自己的爬虫程序。下面我们先从简单的python自带的request库+BS4来实现一个简单网页的爬虫代码。

基本流程

1.获取网页源码(html源码):requests

2.解析自己需要的资源的位置: BeautifulSoup, re(正则表达式)

3.获取(或下载)该资源: urlretrieve (from urllib.request) (python自带用于下载网络文件,本例暂不涉及,后续再说)。

编写代码及思路

首先引入需要的request库+BS4

import requests #用于获取网页
from bs4 import BeautifulSoup  #用于分析网页
import re       #用于在网页中搜索我们需要的关键字
1.获取网页源代码

以抓取搜狐新闻为例,打开网页,单击右键,选中检查选项。

python学习日记:简易爬虫入门_爬虫


点击刷新按钮重新载入页面,注意network中的第一项。如图,显示这个页面是从http://news.sohu.com/ 这个网址,用GET这个方法得到的。

python学习日记:简易爬虫入门_数据_02

我们在程序中使用requests库的get方法,获取网页元代码:

baseurl='http://news.sohu.com/' 
html=requests.get(baseurl)    #用requests库的get方法,获取网页源代码
print(html.text)    #检查结果,过后可删除         
#由于html是一个容器,他的内容放在text这个属性里面,写html.text来取出里面的文字

执行结果如下:

python学习日记:简易爬虫入门_html_03

2.解析资源的位置

我们需要从繁多的代码中,解析出来我们需要的标题,来源,时间和链接这四项,使用BeautifulSoup这个库。

soup=BeautifulSoup(html.text,'html.parser')   #将html.text装进一个soup容器中
#此处html.parser为python自带的一个html解析器

在chrome的检查页面,我们随便右击一个新闻标题,选择检查。然后我们发现自动跳到这一段高亮源代码,这就是这个新闻在网页源码中的位置。

python学习日记:简易爬虫入门_数据_04

我们发现这部分代码的上级都有一个<div class=list16>

python学习日记:简易爬虫入门_Python_05

通过分析,这个class应该代表的就是每一条新闻标题的行。我们只要把class=list16解析出来,就能找出这个页面中所有的新闻,所以使用BeautifulSoup的find_all功能。

newslist=soup.find_all(class_='list16')  #注意find_all返回的是一个列表
print(newslist)   #打印出来看一下,过后可删除

打印结果如下:

python学习日记:简易爬虫入门_Python_06


发现每行结果中都包含一个title,是新闻的标题,一个href,是新闻的链接。
正是我们需要的。

for news in newslist:   #写一个循环
    news_title=news.li.a['title']  #这是BeautifulSoup的功能,‘.’属性返回当前标签的第一个子标签。
                                  #因为上面我们发现   news= <li><a 。。。 </a></li>
                                 #因此我们要进入news的li标签底下的a标签
    news_link=news.li.a['href']  #a标签中包含一个字典,用['href']取出href对应的值
    print(news_title,news_link)  #打印检查,过后可删
for news in newslist:
    try:
        news_title=news.li.a['title']
        news_link=news.li.a['href']
    except:
        print('无法处理')
    else:
        print(news_title,news_link)

通过以上已经获得了新闻的标题和链接。但是有一些链接是不完整的,需要在前面加上‘http:‘。

if  re.match(r'http:',news.li.a['href']):
#re.match 用于判news.li.a['href']是否含有‘http:’字符串,如果没有,加上
    news_link =  news.li.a['href']
else:
    print('加上')
    news_link = 'http:' + news.li.a['href']

这样,我们就基本完成了整个新闻列表页面的获取,下期我们再展开说如何获取到内容页面的主要数据,以及分页获取、分类获取的方法。