Python 网络爬虫

网络爬虫(也称为网络蜘蛛、网络机器人)是一种自动化的程序,可以在互联网上自动地抓取、收集和复制数据。它们通常被用于搜索引擎、数据挖掘、信息提取等应用中。

网络爬虫的工作原理是模拟浏览器的行为,向网站发送请求并获取网页内容。一旦获取到网页内容,爬虫会提取出所需的数据,并将其存储在本地或传输到其他系统。

网络爬虫的优点包括:

  1. 数据抓取速度快:可以快速地抓取大量数据。
  2. 数据更新及时:可以及时获取最新的数据。
  3. 数据质量高:可以抓取到原始数据,避免人工采集的误差。

然而,网络爬虫也存在一些问题,例如:

  1. 对服务器造成压力:大量的请求可能会对目标服务器造成压力,影响其正常运行。
  2. 违反网站robots协议:有些网站设置了robots协议,禁止爬虫抓取其数据。
  3. 侵犯隐私和版权:爬虫可能会抓取到用户的个人信息和版权内容,引发隐私和版权问题。

因此,在使用网络爬虫时需要注意遵循相关法律法规和道德规范,尊重网站和用户的权益,合理使用爬虫技术。

爬虫的爬取过程主要包括以下步骤:

  1. 发起请求:通过HTTP库向目标站点发起请求,可以包含额外的headers、data等信息,然后等待服务器响应。
  2. 获取响应:如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的内容,类型可能有HTML、Json字符串,二进制数据(图片,视频等)等类型。
  3. 解析内容:对于获取到的内容,如果是HTML,可以使用正则表达式或网页解析库进行解析;如果是Json字符串,可以直接转为Json对象解析;如果是二进制数据,可以做保存或者进一步的处理。
  4. 存储数据:存储形式多样,可以存为文本,也可以存储到数据库,或者存为特定格式的文件。

 一、网页请求

        

 

  1. 确定目标网站:爬虫需要明确需要爬取的目标网站,并获取该网站的URL地址。

    URL编码的概念【定义】URL编码(URL encoding):也称作百分号编码(Percent-encoding), 是特定上下文的统一资源定位符 (URL)的编码机制。

    URL编码的作用

    1、防止出现语法错误:如果URL中含有一些特殊字符,比如空格、中文等,这些字符也许会造成URL的语法错误。在URL编码之后,这些特殊字符会被转码为相应的ASCII码,避免了出现语法上的错误。

    2、防止乱码:如果URL中含有一些非ASCII字符,如中文等,由于不同编码之间的差异,可能会造成在浏览器端乱码的情况。在URL编码之后,这些非ASCII字符会被转码为% %和十六进制编码,确保浏览器能正常读取。

    3、安全性:URL中含有敏感信息时,如密码等,需要进行URL编码,以防止被网络攻击者截取和恶意篡改。

  2. 发送HTTP请求:爬虫通过HTTP协议向目标网站发送请求,以获取网页的内容。这通常是通过HTTP库或框架来实现的,例如Python中的Requests库。
  3. 接收HTTP响应:服务器会发送一个HTTP响应,其中包含网页的HTML代码。爬虫接收到这些数据。
  4. 解析HTML:爬虫使用HTML解析器对接收到的HTML代码进行解析,以理解网页的结构和内容。常用的HTML解析库包括Beautiful Soup和lxml。
  5. 提取信息:根据预定的规则和模式,爬虫提取所需的信息,例如标题、文本、链接、图像等。这可能涉及使用CSS选择器或XPath表达式来定位特定的HTML元素。
  6. 跟踪链接:从当前页面中提取的链接,可以添加到待访问的URL列表中,以便后续继续抓取。

 二、爬取静态网页

        

爬取静态网页的步骤:

  1. 确定目标网站:选择需要爬取的静态网页,并获取该网页的URL地址。
  2. 发送HTTP请求:使用HTTP库或框架(如Python中的Requests库)向目标网站发送GET请求,以获取网页的内容。
  3. 接收HTTP响应:服务器会返回一个HTTP响应,其中包含网页的HTML代码。
  4. 解析HTML:使用HTML解析器(如Beautiful Soup或lxml)对接收到的HTML代码进行解析,以提取所需的数据。
  5. 提取信息:根据预定的规则和模式,从解析后的HTML中提取所需的信息,例如标题、文本、链接等。
  6. 存储数据:将提取的信息存储在本地文件或数据库中,以便后续使用或进一步处理。

需要注意的是,有些网站可能会使用反爬虫机制来防止爬虫的访问。因此,在爬取静态网页时,需要注意以下几点:

  • 遵守网站的robots协议和使用条款,避免对网站造成不必要的负担或违反规定。
  • 控制爬取速度和频率,避免对目标服务器造成过大的压力。
  • 处理异常情况,如请求被拒绝、页面不存在等。
  • 使用适当的HTTP请求头信息,模拟真实的浏览器请求,以提高爬取成功率。

示例:

        

import requests  
from bs4 import BeautifulSoup  
  
# 目标网页的URL  
url = "http://example.com"  
  
# 发送HTTP请求并获取响应  
response = requests.get(url)  
  
# 检查响应状态码,确保请求成功  
if response.status_code == 200:  
    # 使用BeautifulSoup解析HTML内容  
    soup = BeautifulSoup(response.content, "html.parser")  
      
    # 提取所需的信息,例如标题和链接  
    title = soup.title.string  
    links = soup.find_all("a")  
      
    # 打印提取的信息  
    print("Title:", title)  
    for link in links:  
        print("Link:", link.get("href"))  
else:  
    print("Failed to retrieve the webpage.")

 

三、解析网页数据

        

解析网页数据是爬虫的一个重要步骤,主要是将获取到的HTML或JSON等格式的数据转换成程序能处理的数据结构,如列表、字典等。常用的网页解析方法有使用正则表达式、Beautiful Soup、Scrapy框架等。

以Beautiful Soup为例,解析HTML数据的基本步骤如下:

  1. 安装Beautiful Soup库:可以使用pip安装,如pip install beautifulsoup4
  2. 导入Beautiful Soup库:在代码中导入Beautiful Soup库。
  3. 解析HTML:使用Beautiful Soup的BeautifulSoup()函数将HTML内容解析成Beautiful Soup对象。
  4. 查找元素:使用Beautiful Soup对象的方法,如find()find_all()等,来查找和提取所需的元素。
  5. 处理数据:将提取的元素转换成程序能处理的数据结构,如字符串、列表、字典等。

示例:

from bs4 import BeautifulSoup  
import requests  
  
# 发送HTTP请求并获取响应  
response = requests.get("http://example.com")  
  
# 解析HTML内容  
soup = BeautifulSoup(response.content, "html.parser")  
  
# 查找标题元素  
title_element = soup.find("title")  
title = title_element.string  
  
# 查找链接元素  
links = soup.find_all("a")  
for link in links:  
    href = link.get("href")  
    print("Link:", href)

 在这个示例中,我们首先使用requests库发送HTTP请求并获取响应。然后,使用BeautifulSoup将HTML内容解析成Beautiful Soup对象。接着,使用find()方法查找标题元素,并使用string属性获取标题文本。最后,使用find_all()方法查找所有的链接元素,并使用get()方法获取每个链接的href属性。

四、爬取动态网页数据 

爬取动态网页数据相对于爬取静态网页数据要复杂一些,因为动态网页的内容是通过JavaScript等客户端脚本动态加载的。

示例:

from selenium import webdriver  
import time  
  
# 启动Chrome浏览器驱动程序  
driver = webdriver.Chrome("path/to/chromedriver")  
  
# 访问目标网页  
driver.get("http://example.com")  
  
# 等待一段时间,让动态内容加载完成  
time.sleep(3)  
  
# 获取网页源代码  
html_content = driver.page_source  
  
# 使用Beautiful Soup解析HTML内容  
from bs4 import BeautifulSoup  
soup = BeautifulSoup(html_content, "html.parser")  
  
# 查找和提取所需的数据  
# ...  
  
# 关闭浏览器驱动程序  
driver.quit()

使用selenium爬取,首先,你需要安装Selenium库和相应的浏览器驱动程序。你可以使用pip安装Selenium库,如pip install selenium。然后,下载相应的浏览器驱动程序,如ChromeDriver。

示例:

from selenium import webdriver
 
url = "http://localhost:63342/test/bookmark.html?_ijt=9ac2liobhrgbsi0qe13uaijqtn&_ij_reload=RELOAD_ON_SAVE"
driver = webdriver.Chrome()
driver.get(url)
 
trs = driver.find_elements_by_xpath('/html/body/table/tr')
markbooks = []
for tr in trs:
    markbook_id = tr.find_elements_by_xpath('./td[1]')[0].text
    markbook_name = tr.find_elements_by_xpath('./td[2]')[0].text
    markbook_info = tr.find_elements_by_xpath('./td[3]')[0].text
    markbook = {
        "markbook_id": markbook_id,
        "markbook_name": markbook_name,
        "markbook_info": markbook_info
    }
    markbooks.append(markbook)
print(markbooks)

其他示例:

UI定位

from selenium import webdriver
 
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
 
# id
getId = driver.find_element_by_id('hotsearch-refresh-btn').text
# print(getId)
 
# name
getName = driver.find_element_by_name('tj_briicon').text
# print(getName)
 
# tag
getTag = driver.find_element_by_tag_name('title')
# print(getTag)
 
# XPath
getXPath = driver.find_element_by_xpath('//*[@id="su"]').get_attribute('value')
# print("XPath" + getXPath)
 
# selector
getSelector = driver.find_element_by_css_selector('#su').get_attribute('value')
# print("Selector:" + getSelector)
鼠标动作

import time
 
from selenium import webdriver
from selenium.webdriver import ActionChains
 
url = "https://www.baidu.com/"
driver = webdriver.Chrome()
driver.get(url)
 
# 鼠标移动text1处
text = driver.find_element_by_xpath('//*[@id="hotsearch-content-wrapper"]/li[2]/a/span[2]')
ActionChains(driver).move_to_element(text).perform()  # perform() 真正去执行鼠标事件
 
# 鼠标拖拽text到input处
input = driver.find_element_by_xpath('//*[@id="kw"]')
ActionChains(driver).drag_and_drop(text, input).perform()
ActionChains(driver).context_click(text)
# 点击查询
query = driver.find_element_by_xpath('//*[@id="su"]')
ActionChains(driver).move_to_element(query).click(query).perform()
time.sleep(10)
#                     点击滑块 且 按住不动
# ActionChains(driver).click_and_hold(on_element=slider).perform()
# #                                  往x轴水平移动  y没移动
# ActionChains(driver).move_by_offset(xoffset=20, yoffset=0).perform()
# time.sleep(1)  # 稍微停顿滑动,应对反扒
# ActionChains(driver).move_by_offset(xoffset=258, yoffset=0).perform()
# #                  暂停1秒后离开鼠标
# ActionChains(driver).pause(1).release().perform()
 
# 窗口切换 1.点击链接
citiao = driver.find_element_by_xpath('//*[@id="1"]/div/div[1]/h3/a')
ActionChains(driver).move_to_element(citiao).click(citiao).perform()
time.sleep(10)
# 2.获取所有窗口
wins1 = driver.window_handles
# 3.切换到新窗口
driver.switch_to.window(wins1[-1])

 

五、储存数据

爬虫储存数据的方式有多种,具体取决于数据的大小、格式和存储需求。以下是一些常见的存储数据的方式:

  1. 文件存储:将爬取的数据存储为文件,如文本文件、CSV文件、JSON文件等。这种方式适用于数据量较小的情况,并且可以方便地与其他程序或系统进行集成。
  2. 数据库存储:将爬取的数据存储到数据库中,如关系型数据库(如MySQL、PostgreSQL等)、非关系型数据库(如MongoDB、Cassandra等)。这种方式适用于数据量较大且需要高效检索的情况。
  3. 云存储:将爬取的数据存储到云存储服务中,如Amazon S3、Google Cloud Storage等。这种方式适用于数据量非常大,需要分布式存储和高度可扩展的情况。
  4. 数据仓库:将爬取的数据存储到数据仓库中,如Google BigQuery、Amazon Redshift等。这种方式适用于需要对大量数据进行复杂分析和挖掘的情况。

 六、Scrapy框架

Scrapy是一个适用于Python的快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。

Scrapy框架可以分为以下几个部分:

  1. Engine(引擎):处理整个系统的数据流处理,触发事务,是整个框架的核心。
  2. Item(项目):定义了爬取结果的数据结构,爬取数据会被赋为Item对象。
  3. Scheduler(调度器):接受引擎发过来的的请求并将其加入队列中,在引擎需要时将请求提供给引擎。
  4. Downloader(下载器):下载网页内容,并将网页内容返回给爬虫。
  5. Spiders(爬虫):定义了爬取的逻辑和网页的解析规则,主要负责解析响应并生成提取结果和新的请求。

Scrapy框架的特点包括:

  1. 基于Twisted的异步处理框架,架构清晰,模块耦合度低,可扩展性极强,可以灵活完成各种需求。
  2. 只需要定制开发几个模块就可以轻松实现一个爬虫。
  3. 适用于数据挖掘、信息处理或存储历史数据等一系列的程序中。
  4. 通常可以很简单的通过Scrapy框架实现一个爬虫,抓取指定网站的内容或图片

示例:

  1. 安装Scrapy框架:可以使用pip安装,如pip install scrapy

  2. 创建一个新的Scrapy项目:使用命令行工具进入项目目录,并运行scrapy startproject myproject命令,其中myproject是你的项目名称。

  3. 创建一个新的Scrapy爬虫:使用命令行工具进入项目目录,并运行scrapy genspider myspider example.com命令,其中myspider是你的爬虫名称,example.com是你要爬取的网站域名。

  4. 编写爬虫逻辑:在myspider.py文件中编写爬虫逻辑。以下是一个简单的示例:

    import scrapy  
      
    class MySpider(scrapy.Spider):  
        name = 'myspider'  
        start_urls = ['http://example.com']  
      
        def parse(self, response):  
            # 提取网页内容  
            title = response.css('title::text').get()  
            content = response.css('body::text').get()  
              
            # 打印提取的内容  
            print(f"Title: {title}")  
            print(f"Content: {content}")

  5. 运行爬虫:使用命令行工具进入项目目录,并运行scrapy crawl myspider命令,其中myspider是你的爬虫名称。

示例中,我们创建了一个名为MySpider的爬虫,并指定了要爬取的起始URL为http://example.com。在parse()方法中,我们使用CSS选择器提取了网页的标题和正文内容,并打印出来。你可以根据需要修改CSS选择器来提取不同的网页元素。 

 在使用网络爬虫时需要注意遵循相关法律法规和道德规范,尊重网站和用户的权益,合理使用爬虫技术。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值