Python爬虫是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫是啥?相关的知识,希望对你有一定的参考价值。
为自动提取网页的程序,它为搜索引擎从万维网上下载网页。
网络爬虫为一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索。
扩展资料:
网络爬虫的相关要求规定:
1、由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。
2、按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。 当同一层次中的页面爬行完毕后,爬虫再深入下一层继续爬行。
3、文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能。
参考资料来源:百度百科-网络爬虫
参考技术A首先要知道python爬虫是一个程序,这个程序的目的就是为了抓取万维网信息资源,比如你日常使用的谷歌等搜索引擎,搜索结果就全都依赖爬虫来定时获取
了解一个python爬虫离不开了解一下爬虫的基本原理,接下来我们来讲解一下这个原理。
网页请求的过程分为两个环节:
1. Request (请求):每一个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。
2. Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容,客户端接收服务器响应的内容,将内容展示出来,就是我们所熟悉的网页请求,如图 所示。
网页请求的方式也分为两种:
1. GET:最常见的方式,一般用于获取或者查询资源信息,也是大多数网站使用的方式,响应速度快。
2. POST:相比 GET 方式,多了以表单形式上传参数的功能,因此除查询信息外,还可以修改信息。
所以,在写爬虫前要先确定向谁发送请求,用什么方式发送。
爬虫的目标对象也很丰富,不论是文字、图片、视频,任何结构化非结构化的数据爬虫都可以爬取,爬虫经过发展,也衍生出了各种爬虫类型:
通用网络爬虫:爬取对象从一些种子 URL 扩充到整个 Web,搜索引擎干的就是这些事
垂直网络爬虫:针对特定领域主题进行爬取,比如专门爬取小说目录以及章节的垂直爬虫
增量网络爬虫:对已经抓取的网页进行实时更新
深层网络爬虫:爬取一些需要用户提交关键词才能获得的 Web 页面
不想说这些大方向的概念,让我们以一个获取网页内容为例,从爬虫技术本身出发,来说说网页爬虫,步骤如下:
模拟请求网页资源
从HTML提取目标元素
数据持久化
什么是爬虫,这就是爬虫:
"""让我们根据上面说的步骤来完成一个简单的爬虫程序"""
import requests
from bs4 import BeautifulSoup
target_url = 'http://www.baidu.com/s?wd=爬虫'
# 第一步 发起一个GET请求
res = requests.get(target_url)
# 第二步 提取HTML并解析想获取的数据 比如获取 title
soup = BeautifulSoup(res.text, "lxml")
# 输出 soup.title.text
title = soup.title.text
# 第三步 持久化 比如保存到本地
with open('title.txt', 'w') as fp:
fp.write(title)
加上注释不到20行代码,你就完成了一个爬虫,简单吧
你就能精通 Python,成为未来抢手的人才。
python新手入门知识
python交流圈
&意思:1.逻辑上表示and (和)的意思。A & B表示A、B两种元素缺一不可。2.&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。&最早是拉丁语et (意为and)的连写。最早的&很像E和 的组合,随着印刷技术的发展,这个符号逐渐形成自己的样式并脱离其原始影子。 英文中代表and,也可读and 该字符读音“z\'da”。拓展资料&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
参考技术C 世界上80%的爬虫是基于Python开发的,学好爬虫技能,可为后续的大数据分析、挖掘、机器学习等提供重要的数据源。什么是爬虫?
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
其实通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据
爬虫可以做什么?
你可以用爬虫爬图片,爬取视频等等你想要爬取的数据,只要你能通过浏览器访问的数据都可以通过爬虫获取。
爬虫的本质是什么?
模拟浏览器打开网页,获取网页中我们想要的那部分数据
浏览器打开网页的过程:
当你在浏览器中输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器经过解析后发送给用户浏览器结果,包括html,js,css等文件内容,浏览器解析出来最后呈现给用户在浏览器上看到的结果
所以用户看到的浏览器的结果就是由HTML代码构成的,我们爬虫就是为了获取这些内容,通过分析和过滤html代码,从中获取我们想要资源。 参考技术D python是一种计算机的编程语言,是这么多计算机编程语言中比较容易学的一种,而且应用也广,这python爬虫是什么意思呢?和IPIDEA全球http去了解一下python爬虫的一些基础知识。
一、python爬虫是什么意思
爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
即:打开一个网页,有个工具,可以把网页上的内容获取下来,存到你想要的地方,这个工具就是爬虫。
Python爬虫架构组成:
1.网页解析器,将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。
2.URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
3.网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
4.调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
5.应用程序:就是从网页中提取的有用数据组成的一个应用。
二、爬虫怎么抓取数据
1.抓取网页
抓取网页有时候需要模拟浏览器的行为,很多网站对于生硬的爬虫抓取都是封杀的。这是我们需要模拟user agent的行为构造合适的请求,比如模拟用户登陆、模拟session/cookie的存储和设置。
2.抓取后处理
抓取的网页通常需要处理,比如过滤html标签,提取文本等。python的beautifulsoap提供了简洁的文档处理功能,能用极短的代码完成大部分文档的处理。
其实以上功能很多语言和工具都能做,但是用python能够干得最快,最干净。上文介绍了python爬虫的一些基础知识,相信大家对于“python爬虫是什么意思”与“爬虫怎么抓取数据”有一定的的认识了。现在大数据时代,很多学python的时候都是以爬虫入手,学习网络爬虫的人越来越多。通常使用爬虫抓取数据都会遇到IP限制问题,使用高匿代理,可以突破IP限制,帮助爬虫突破网站限制次数。
编写可维护的网络爬虫的最佳实践是啥?
【中文标题】编写可维护的网络爬虫的最佳实践是啥?【英文标题】:What is the best practice for writing maintainable web scrapers?编写可维护的网络爬虫的最佳实践是什么? 【发布时间】:2014-02-10 17:38:48 【问题描述】:我需要实现一些爬虫来抓取一些网页(因为该网站没有开放的 API),提取信息并保存到数据库。我目前正在使用漂亮的汤来编写这样的代码:
discount_price_text = soup.select("#detail-main del.originPrice")[0].string;
discount_price = float(re.findall('[\d\.]+', discount_price_text)[0]);
我猜这样的代码很容易在网页改变时变得无效,即使是轻微的改变。 除了编写回归测试以定期运行以捕获故障之外,我应该如何编写不易受这些变化影响的爬虫?
特别是,即使原始 xpath/css 选择器不再有效,是否有任何现有的“智能抓取工具”可以进行“尽力猜测”?
【问题讨论】:
硒。 pypi.python.org/pypi/selenium 【参考方案1】:页面有可能发生如此巨大的变化,以至于构建一个非常“智能”的刮板可能非常困难;如果可能的话,即使使用机器学习等花哨的技术,刮板也会有些不可预测。很难制作一个兼具可信赖性和自动化灵活性的爬虫。
可维护性在某种程度上是一种艺术形式,以如何定义和使用选择器为中心。
过去我推出了自己的“两阶段”选择器:
(find) 第一阶段非常不灵活,它检查页面结构是否朝向所需元素。如果第一阶段失败,则会引发某种“页面结构已更改”错误。
(检索)然后第二阶段有点灵活,从页面上的所需元素中提取数据。
这允许爬虫通过某种程度的自动检测将自己与剧烈的页面更改隔离开来,同时仍保持一定程度的可信赖的灵活性。
我经常使用 xpath 选择器,这真的很令人惊讶,通过一些练习,你可以在使用一个好的选择器的同时保持非常准确的灵活性。我确信css选择器是相似的。页面设计越语义化和“扁平化”,这就越容易。
需要回答的几个重要问题是:
您希望页面上有什么变化?
您希望页面上的哪些内容保持不变?
回答这些问题时,您的选择器越准确,您的选择器就越好。
最后,您可以选择要承担多大的风险,选择器的可信度如何,在页面上查找和检索数据时,您如何制作它们会产生很大的不同;理想情况下,最好从 web-api 获取数据,希望更多来源开始提供。
编辑:小例子
使用您的场景,您想要的元素位于.content > .deal > .tag > .price
,一般.content .price
选择器在页面更改方面非常“灵活”;但是,如果出现误报元素,我们可能希望避免从这个新元素中提取。
使用两阶段选择器,我们可以指定一个不太通用、更不灵活的第一阶段,例如.content > .deal
,然后是第二个更通用的阶段,例如.price
,使用查询relative em> 到第一个结果。
那么为什么不直接使用 .content > .deal .price
这样的选择器呢?
就我的使用而言,我希望能够检测大页面更改而无需单独运行额外的回归测试。我意识到我可以编写第一阶段来包含重要的页面结构元素,而不是一个大的选择器。如果结构元素不再存在,第一阶段将失败(或报告)。然后我可以编写第二阶段,以更优雅地检索与第一阶段的结果相关的数据。
我不应该说这是“最佳”做法,但效果很好。
【讨论】:
谢谢!我完全同意选择健壮的选择器是一种艺术形式。我实际上正在考虑编写多个级别的选择器,从非常具体的(如 .content>.deal>.tag>.price)到非常一般的(.content .price),如果当前级别失败,则回退到下一个级别,但我不确定这是一个好主意,因为它可能会引入误报。有时失败总比得到错误的数据好......在你的两阶段模型中,当你说检索可以“有点灵活”时,你是什么意思?当我找到元素时,我只需要提取数据,对吧? 我所说的“有点灵活”是指灵活相对由第一阶段选择器检索到的页面子部分。我在上面添加了一个小例子。【参考方案2】:与 Python 完全无关且不具备自动灵活性,但我认为我的 Xidel scraper 的模板具有最好的可维护性。
你可以这样写:
<div id="detail-main">
<del class="originPrice">
extract(., "[0-9.]+")
</del>
</div>
模板的每个元素都与网页上的元素进行匹配,如果它们相同,则评估 中的表达式。
页面上的其他元素将被忽略,因此如果您在包含的元素和已删除的元素之间找到适当的平衡,则模板将不受所有细微更改的影响。 另一方面,重大更改将触发匹配失败,这比 xpath/css 只会返回一个空集要好得多。然后您可以在模板中仅更改已更改的元素,在理想情况下,您可以直接将旧/更改页面之间的差异应用于模板。在任何情况下,您都不需要搜索受影响的选择器或针对单个更改更新多个选择器,因为模板可以包含单个页面的所有查询。
【讨论】:
【参考方案3】:编辑: 糟糕,我现在看到您已经在使用 CSS 选择器了。我认为他们为您的问题提供了最佳答案。所以不,我认为没有更好的方法。
但是,有时您可能会发现没有结构更容易识别数据。例如,如果你想抓取价格,你可以做一个匹配价格的正则表达式搜索(\$\s+[0-9.]+
),而不是依赖于结构。
就我个人而言,我尝试过的各种开箱即用的网络爬虫库都有一些不足之处(mechanize、Scrapy 等)。
我通常自己滚动,使用:
urllib2(标准库), lxml 和 cssselectcssselect 允许您使用 CSS 选择器(就像 jQuery 一样)来查找特定的 div、表格等。这被证明是非常宝贵的。
从 SO 主页获取第一个问题的示例代码:
import urllib2
import urlparse
import cookielib
from lxml import etree
from lxml.cssselect import CSSSelector
post_data = None
url = 'http://www.***.com'
cookie_jar = cookielib.CookieJar()
http_opener = urllib2.build_opener(
urllib2.HTTPCookieProcessor(cookie_jar),
urllib2.HTTPSHandler(debuglevel=0),
)
http_opener.addheaders = [
('User-Agent', 'Mozilla/5.0 (X11; Linux i686; rv:25.0) Gecko/20100101 Firefox/25.0'),
('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
]
fp = http_opener.open(url, post_data)
parser = etree.HTMLParser()
doc = etree.parse(fp, parser)
elem = CSSSelector('#question-mini-list > div:first-child > div.summary h3 a')(doc)
print elem[0].text
当然,你不需要 cookiejar,也不需要用户代理来模拟 FireFox,但是我发现在抓取网站时我经常需要它。
【讨论】:
以上是关于Python爬虫是啥?的主要内容,如果未能解决你的问题,请参考以下文章