Python 爬虫实战:驾驭数据洪流,揭秘网页深处
爬虫,这个经常被人提到的词,是对数据收集过程的一种形象化描述。特别是在Python语言中,由于其丰富的库资源和良好的易用性,使得其成为编写爬虫的绝佳选择。本文将从基础知识开始,深入浅出地讲解Python爬虫的相关知识,并分享一些独特的用法和实用技巧。本文将以实际的网站为例,深入阐述各个处理部分,并展示输出,助力大家快速掌握Python爬虫技巧。
开始之前:必要的库
Python有很多库可以用来编写爬虫,但我们这里重点介绍两个:requests和BeautifulSoup。
import requests
from bs4 import BeautifulSoup
requests
库用于发送HTTP请求,而BeautifulSoup
库则用于解析HTTP响应中的HTML。
基本爬虫:爬取全部网页内容
以Python官方网站(https://www.python.org/)为例,一个基本的Python爬虫可能会这样编写:
url = "https://www.python.org/"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.prettify()[:500])
这段代码的目的是获取网页的内容,并使用BeautifulSoup库进行解析。我们可以看到,requests.get(url)
是用来发送GET请求的,而BeautifulSoup(response.text, 'html.parser')
则是用来解析HTTP响应中的HTML内容的。
这段代码的输出前500个字符如下:
<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js ie6 lt-ie7 lt-ie8 lt-ie9"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 lt-ie8 lt-ie9"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--><html class="no-js" dir="ltr" lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8"/>
<meta content="IE=edge" http-equiv="X-UA-Compatible"/>
<meta content="Python.org" name="application-name"/>
<meta content="The official home of the Python Programming Language"
使用CSS选择器爬取特定元素
当我们希望获取特定元素时,我们可以使用CSS选择器。比如我们希望获取Python官方网站中所有的头部链接:
elements = soup.select('div.top-bar > ul > li > a')
for element in elements:
print(element.get('href'), element.text)
在这里,div.top-bar > ul > li > a
是一个CSS选择器,用来选择
class为top-bar
的div元素下的ul元素中的li元素下的a元素。这些a元素就是我们想要的头部链接。
这段代码的部分输出如下:
/ Python
/psf-landing/ PSF
/docs/ Docs
/pypl/ PyPI
/jobs/ Jobs
/community-landing/ Community
HTML解析语言爬取:XPath
除了CSS选择器,还有一种常用的HTML解析技术是XPath。XPath,全称XML Path Language,是一门在XML文档中查找信息的语言,也可以用在HTML文档解析中。
Python的lxml
库提供了XPath的支持:
from lxml import etree
html = '<div><a href="/a">A</a><a href="/b">B</a></div>'
root = etree.HTML(html)
links = root.xpath('//a/@href')
print(links)
在这段代码中,我们首先定义了一个HTML字符串。然后,我们使用etree.HTML()
函数将这个字符串解析成一个DOM树。最后,我们使用root.xpath()
方法提取出所有的链接。
绝对链接爬取
你可能已经注意到,上述代码的输出中的链接是相对链接,而不是绝对链接。如果我们希望获取绝对链接,我们可以使用urljoin
函数:
from urllib.parse import urljoin
elements = soup.select('div.top-bar > ul > li > a')
for element in elements:
absolute_url = urljoin(url, element.get('href'))
print(absolute_url, element.text)
这段代码的部分输出如下:
https://www.python.org/ Python
https://www.python.org/psf-landing/ PSF
https://www.python.org/docs/ Docs
https://www.python.org/pypl/ PyPI
https://www.python.org/jobs/ Jobs
https://www.python.org/community-landing/ Community
动态加载的数据爬取:Selenium
在许多现代的网页中,数据可能不是在页面加载时一次性加载的,而是通过JavaScript在用户与页面交互时动态加载的。这时,我们可能需要使用另一个工具:Selenium。
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://www.python.org/')
element = driver.find_element_by_css_selector('div.top-bar > ul > li > a')
print(element.text)
这段代码使用Selenium模拟浏览器行为,获取JavaScript动态加载的数据。在这个例子中,我们只获取了第一个链接的文本,实际使用时,你可能需要根据需求进行更复杂的操作。
爬虫代理
使用代理,可以帮助我们隐藏自己的真实IP地址,从而避免因爬取同一网站过多数据而被封IP。下面是一段简单的使用代理的代码:
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
response = requests.get("https://www.python.org/", proxies=proxies)
在这里,我们定义了一个代理字典,并将其传给requests.get()
函数。这样,我们的请求就会通过代理服务器发送,从而隐藏了我们的真实IP地址。
异步爬虫:提升爬虫效率
在爬取大量数据时,我们通常需要进行多次HTTP请求,如果每次请求都等待前一次请求完成,那么效率将会非常低。此时,我们可以使用Python的异步IO库asyncio
和aiohttp
来提高效率。下面是一个简单的例子:
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://python.org')
print(html[:500])
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
在这段代码中,我们首先定义了一个异步的fetch
函数,用于发送HTTP请求并获取响应。然后,我们在main
函数中创建一个HTTP会话,并使用这个会话来发送请求。最后,我们使用事件循环来运行main
函数。
爬虫框架:Scrapy
虽然使用上述方法可以实现爬虫的基本功能,但在处理更复杂的爬虫任务时,我们可能需要一个更强大的工具。Scrapy是一个用Python实现的强大的爬虫框架,它为我们提供了许多高级功能,比如并发请求、数据处理和存储等。
下面是一个简单的Scrapy爬虫的例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://python.org']
def parse(self, response):
self.log('Visited %s' % response.url)
yield {
'url': response.url,
'title': response.css('title::text').get(),
}
在这段代码中,我们定义了一个继承自scrapy.Spider
的爬虫类。这个类中定义了爬虫的名字、开始的URL和解析响应的方法。Scrapy将会自动为我们处理请求的发送和响应的接收,我们只需要关心如何从响应中提取数据即可。
自动化任务:定时爬虫
有时我们需要定时执行爬虫任务,比如每天爬取一次网站的数据。Python的schedule
库可以帮助我们实现这一点:
import schedule
import time
def job():
print("I'm working...")
schedule.every(10).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(1)
在这段代码中,我们首先定义了一个爬虫任务job
。然后,我们使用schedule.every().seconds.do()
方法设置任务的执行间隔。最后,我们使用一个无限循环来不断执行待运行的任务。
爬虫道德规范:遵守robots.txt
在进行爬虫时,我们需要尊重网站的robots.txt
规则。robots.txt
是一个存放在网站根目录下的文本文件,用于告诉爬虫哪些页面可以抓取,哪些页面不可以抓取。
Python的urllib.robotparser
模块可以帮助我们解析robots.txt
:
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url('http://www.python.org/robots.txt')
rp.read()
can_fetch = rp.can_fetch('*', 'http://www.python.org/')
print(can_fetch)
在这段代码中,我们首先创建了一个RobotFileParser
对象,然后使用set_url
方法设置robots.txt
的URL,并使用read
方法读取和解析robots.txt
。最后,我们使用can_fetch
方法判断我们的爬虫是否可以抓取指定的URL。
请注意,不是所有的网站都有robots.txt
,也不是所有的网站都会严格遵守robots.txt
。在爬取网站时,除了尊重robots.txt
,我们还应该尽量减小爬虫对网站的影响,例如限制爬取频率,避免在网站高访问量的时候爬取。
总结
总结起来,Python爬虫虽然有许多复杂的技术和知识点,但只要掌握了基础知识和一些实用技巧,就可以解决大部分的爬虫任务。未来,我将继续分享更多的Python爬虫知识和技巧。
如有帮助,请多关注
个人微信公众号:【Python全视角】
TeahLead_KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。
Python 爬虫实战:驾驭数据洪流,揭秘网页深处的更多相关文章
- Python爬虫实战(4):豆瓣小组话题数据采集—动态网页
1, 引言 注释:上一篇<Python爬虫实战(3):安居客房产经纪人信息采集>,访问的网页是静态网页,有朋友模仿那个实战来采集动态加载豆瓣小组的网页,结果不成功.本篇是针对动态网页的数据 ...
- PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)
说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...
- Python爬虫实战---抓取图书馆借阅信息
Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...
- Python爬虫实战六之抓取爱问知识人问题并保存至数据库
大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...
- Python爬虫实战五之模拟登录淘宝并获取所有订单
经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...
- Python爬虫实战三之实现山东大学无线网络掉线自动重连
综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...
- python爬虫实战——5分钟做个图片自动下载器
python爬虫实战——图片自动下载器 制作爬虫的基本步骤 顺便通过这个小例子,可以掌握一些有关制作爬虫的基本的步骤. 一般来说,制作一个爬虫需要分以下几个步骤: 分析需求(对,需求分析非常重要, ...
- Python 爬虫实战(二):使用 requests-html
Python 爬虫实战(一):使用 requests 和 BeautifulSoup,我们使用了 requests 做网络请求,拿到网页数据再用 BeautifulSoup 解析,就在前不久,requ ...
- 《精通Python网络爬虫》|百度网盘免费下载|Python爬虫实战
<精通Python网络爬虫>|百度网盘免费下载|Python爬虫实战 提取码:7wr5 内容简介 为什么写这本书 网络爬虫其实很早就出现了,最开始网络爬虫主要应用在各种搜索引擎中.在搜索引 ...
- python爬虫实战---爬取大众点评评论
python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...
随机推荐
- 聊聊Redis sentinel 机制
Redis 的哨兵机制自动完成了以下三大功能,从而实现了主从库的自动切换,可以降低 Redis 集群的运维开销: 监控主库运行状态,并判断主库是否客观下线: 在主库客观下线后,选取新主库: 选出新主库 ...
- 手写 HashSet的底层 和 迭代器
1 package Test.CollectionIterator; 2 import java.util.Iterator; 3 public class MyHashSet2<E> i ...
- Appuploader安装指南
转载:http://kxdang.com/topic/appuploader/install.html 下载和安装appuploader IOS开发工具官网地址 http://www.applicat ...
- 目标检测(Object Detection)
文章目录 目标检测(Object Detection) 一.基本概念 1. 什么是目标检测 2. 目标检测的核心问题 3. 目标检测算法分类 1)Tow Stage 2)One Stage 4. 目标 ...
- RocketMQ的简单使用
大家好,我是Leo!今天来和大家分享RocketMQ的一些用法. 领域模型介绍 Producer: 用于生产消息的运行实体. Topic: 主题,用于消息传输和存储的分组容器. MessageQueu ...
- vCenter报错:Log Disk Exhaustion on 10
vCenter报错:Log Disk Exhaustion on 10 1.问题现象: 巡检时发现 vCenter Server 中,错误显示为:Log Disk Exhaustion on 10(字 ...
- CentOS 8 部署 ELK 8.7真的是方便呀
之前装过一次 ELK 7.7,相比之下装 8.7可方便太多了~ CentOS版本 CentOS-8.5.2111-x86_64-dvd1 JAVA ELK会自己使用内置版本的JDK ElasticSe ...
- 2022-08-30:给你一个字符串化学式 formula ,返回 每种原子的数量 。 原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。 如果数量大于 1,原子后会跟着数
2022-08-30:给你一个字符串化学式 formula ,返回 每种原子的数量 . 原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字. 如果数量大于 1,原子后会跟着数 ...
- 2021-10-25:计数质数。统计所有小于非负整数 n 的质数的数量。力扣204。
2021-10-25:计数质数.统计所有小于非负整数 n 的质数的数量.力扣204. 福大大 答案2021-10-25: 自然智慧即可.从i从3开始遍历,每次加2,i*i<n. 代码用golan ...
- Windows服务程序管理器 - 开源研究系列文章
这些天弄了一个Windows服务程序管理器,主要是对需要的Windows服务程序进行管理.这个也能够将自己开发的服务程序注册到操作系统里去运行. 1. 项目目录: 目录见下图,对代码进行 ...