翼度科技»论坛 编程开发 python 查看内容

Python 爬虫实战:驾驭数据洪流,揭秘网页深处

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
爬虫,这个经常被人提到的词,是对数据收集过程的一种形象化描述。特别是在Python语言中,由于其丰富的库资源和良好的易用性,使得其成为编写爬虫的绝佳选择。本文将从基础知识开始,深入浅出地讲解Python爬虫的相关知识,并分享一些独特的用法和实用技巧。本文将以实际的网站为例,深入阐述各个处理部分,并展示输出,助力大家快速掌握Python爬虫技巧。
开始之前:必要的库

Python有很多库可以用来编写爬虫,但我们这里重点介绍两个:requests和BeautifulSoup。
  1. import requests
  2. from bs4 import BeautifulSoup
复制代码
requests库用于发送HTTP请求,而BeautifulSoup库则用于解析HTTP响应中的HTML。
基本爬虫:爬取全部网页内容

以Python官方网站(https://www.python.org/)为例,一个基本的Python爬虫可能会这样编写:
  1. url = "https://www.python.org/"
  2. response = requests.get(url)
  3. soup = BeautifulSoup(response.text, 'html.parser')
  4. print(soup.prettify()[:500])
复制代码
这段代码的目的是获取网页的内容,并使用BeautifulSoup库进行解析。我们可以看到,requests.get(url)是用来发送GET请求的,而BeautifulSoup(response.text, 'html.parser')则是用来解析HTTP响应中的HTML内容的。
这段代码的输出前500个字符如下:
  1. <!DOCTYPE html>
  2. <html  dir="ltr" lang="en">  
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta content="IE=edge" http-equiv="X-UA-Compatible"/>
  6. <meta content="Python.org" name="application-name"/>
  7. <meta content="The official home of the Python Programming Language"
复制代码
HTML解析语言爬取:XPath

除了CSS选择器,还有一种常用的HTML解析技术是XPath。XPath,全称XML Path Language,是一门在XML文档中查找信息的语言,也可以用在HTML文档解析中。
Python的lxml库提供了XPath的支持:
  1. elements = soup.select('div.top-bar > ul > li > a')
  2. for element in elements:
  3.     print(element.get('href'), element.text)
复制代码
在这段代码中,我们首先定义了一个HTML字符串。然后,我们使用etree.HTML()函数将这个字符串解析成一个DOM树。最后,我们使用root.xpath()方法提取出所有的链接。
绝对链接爬取

你可能已经注意到,上述代码的输出中的链接是相对链接,而不是绝对链接。如果我们希望获取绝对链接,我们可以使用urljoin函数:
  1. / Python
  2. /psf-landing/ PSF
  3. /docs/ Docs
  4. /pypl/ PyPI
  5. /jobs/ Jobs
  6. /community-landing/ Community
复制代码
这段代码的部分输出如下:
  1. from lxml import etree
  2. html = '<a target="_blank" href="https://www.cnblogs.com/a">A</a><a target="_blank" href="https://www.cnblogs.com/b">B</a>'
  3. root = etree.HTML(html)
  4. links = root.xpath('//a/@href')
  5. print(links)
复制代码
动态加载的数据爬取:Selenium

在许多现代的网页中,数据可能不是在页面加载时一次性加载的,而是通过JavaScript在用户与页面交互时动态加载的。这时,我们可能需要使用另一个工具:Selenium。
  1. from urllib.parse import urljoin
  2. elements = soup.select('div.top-bar > ul > li > a')
  3. for element in elements:
  4.     absolute_url = urljoin(url, element.get('href'))
  5.     print(absolute_url, element.text)
复制代码
这段代码使用Selenium模拟浏览器行为,获取JavaScript动态加载的数据。在这个例子中,我们只获取了第一个链接的文本,实际使用时,你可能需要根据需求进行更复杂的操作。
爬虫代理

使用代理,可以帮助我们隐藏自己的真实IP地址,从而避免因爬取同一网站过多数据而被封IP。下面是一段简单的使用代理的代码:
  1. https://www.python.org/ Python
  2. https://www.python.org/psf-landing/ PSF
  3. https://www.python.org/docs/ Docs
  4. https://www.python.org/pypl/ PyPI
  5. https://www.python.org/jobs/ Jobs
  6. https://www.python.org/community-landing/ Community
复制代码
在这里,我们定义了一个代理字典,并将其传给requests.get()函数。这样,我们的请求就会通过代理服务器发送,从而隐藏了我们的真实IP地址。
异步爬虫:提升爬虫效率

在爬取大量数据时,我们通常需要进行多次HTTP请求,如果每次请求都等待前一次请求完成,那么效率将会非常低。此时,我们可以使用Python的异步IO库asyncio和aiohttp来提高效率。下面是一个简单的例子:
  1. from selenium import webdriver
  2. driver = webdriver.Firefox()
  3. driver.get('https://www.python.org/')
  4. element = driver.find_element_by_css_selector('div.top-bar > ul > li > a')
  5. print(element.text)
复制代码
在这段代码中,我们首先定义了一个异步的fetch函数,用于发送HTTP请求并获取响应。然后,我们在main函数中创建一个HTTP会话,并使用这个会话来发送请求。最后,我们使用事件循环来运行main函数。
爬虫框架:Scrapy

虽然使用上述方法可以实现爬虫的基本功能,但在处理更复杂的爬虫任务时,我们可能需要一个更强大的工具。Scrapy是一个用Python实现的强大的爬虫框架,它为我们提供了许多高级功能,比如并发请求、数据处理和存储等。
下面是一个简单的Scrapy爬虫的例子:
  1. proxies = {
  2.     "http": "http://10.10.1.10:3128",
  3.     "https": "http://10.10.1.10:1080",
  4. }
  5. response = requests.get("https://www.python.org/", proxies=proxies)
复制代码
在这段代码中,我们定义了一个继承自scrapy.Spider的爬虫类。这个类中定义了爬虫的名字、开始的URL和解析响应的方法。Scrapy将会自动为我们处理请求的发送和响应的接收,我们只需要关心如何从响应中提取数据即可。
自动化任务:定时爬虫

有时我们需要定时执行爬虫任务,比如每天爬取一次网站的数据。Python的schedule库可以帮助我们实现这一点:
  1. import asyncio
  2. import aiohttp
  3. async def fetch(session, url):
  4.     async with session.get(url) as response:
  5.         return await response.text()
  6. async def main():
  7.     async with aiohttp.ClientSession() as session:
  8.         html = await fetch(session, 'http://python.org')
  9.         print(html[:500])
  10. loop = asyncio.get_event_loop()
  11. loop.run_until_complete(main())
复制代码
在这段代码中,我们首先定义了一个爬虫任务job。然后,我们使用schedule.every().seconds.do()方法设置任务的执行间隔。最后,我们使用一个无限循环来不断执行待运行的任务。
爬虫道德规范:遵守robots.txt

在进行爬虫时,我们需要尊重网站的robots.txt规则。robots.txt是一个存放在网站根目录下的文本文件,用于告诉爬虫哪些页面可以抓取,哪些页面不可以抓取。
Python的urllib.robotparser模块可以帮助我们解析robots.txt:
  1. import scrapy
  2. class MySpider(scrapy.Spider):
  3.     name = 'myspider'
  4.     start_urls = ['http://python.org']
  5.     def parse(self, response):
  6.         self.log('Visited %s' % response.url)
  7.         yield {
  8.             'url': response.url,
  9.             'title': response.css('title::text').get(),
  10.         }
复制代码
在这段代码中,我们首先创建了一个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产品业务负责人。

来源:https://www.cnblogs.com/xfuture/p/17531982.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具