随着人工智能、大数据及大数据分析等逐渐成为热门,随着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视频;元描述;元标签。
什么是爬虫
爬虫是一种自动化程序,通过网络协议来获取特定网站的信息,例如图片、文字、视频等等。可以是公开数据,也可以是需要用户授权的私有数据。通过数据的自动下载和处理,可以轻易地获取大规模数据,从而进行各种分析和挖掘。
爬虫的一般流程
- 定义目标网站
- 发送http请求并获取相应网页源码(html源代码)
- 解析相应数据
- 存储数据
写一个简单的爬虫
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.获取网页源代码
以抓取搜狐新闻为例,打开网页,单击右键,选中检查选项。
点击刷新按钮重新载入页面,注意network中的第一项。如图,显示这个页面是从http://news.sohu.com/ 这个网址,用GET这个方法得到的。
我们在程序中使用requests库的get方法,获取网页元代码:
baseurl='http://news.sohu.com/'
html=requests.get(baseurl) #用requests库的get方法,获取网页源代码
print(html.text) #检查结果,过后可删除
#由于html是一个容器,他的内容放在text这个属性里面,写html.text来取出里面的文字
执行结果如下:
2.解析资源的位置
我们需要从繁多的代码中,解析出来我们需要的标题,来源,时间和链接这四项,使用BeautifulSoup这个库。
soup=BeautifulSoup(html.text,'html.parser') #将html.text装进一个soup容器中
#此处html.parser为python自带的一个html解析器
在chrome的检查页面,我们随便右击一个新闻标题,选择检查。然后我们发现自动跳到这一段高亮源代码,这就是这个新闻在网页源码中的位置。
我们发现这部分代码的上级都有一个<div class=list16>
通过分析,这个class应该代表的就是每一条新闻标题的行。我们只要把class=list16解析出来,就能找出这个页面中所有的新闻,所以使用BeautifulSoup的find_all功能。
newslist=soup.find_all(class_='list16') #注意find_all返回的是一个列表
print(newslist) #打印出来看一下,过后可删除
打印结果如下:
发现每行结果中都包含一个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']
这样,我们就基本完成了整个新闻列表页面的获取,下期我们再展开说如何获取到内容页面的主要数据,以及分页获取、分类获取的方法。