SSR1的爬虫思路

SSR1的爬虫思路

😘温馨提示:本文只讲述了部分爬虫技巧,需要更深入的爬虫学习,请自行寻找更好的教程 本文受害者:Python爬虫案例 | Scrape Center 1.讲解爬虫库 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析

😘温馨提示:本文只讲述了部分爬虫技巧,需要更深入的爬虫学习,请自行寻找更好的教程

本文受害者:Python爬虫案例 | Scrape Center

1.讲解爬虫库

1. BeautifulSoup

BeautifulSoup是最常用的Python网页解析库之一,可将 HTML 和 XML 文档解析为树形结构,能更方便地识别和提取数据。

BeautifulSoup可以自动将输入文档转换为 Unicode,将输出文档转换为 UTF-8。此外,你还可以设置 BeautifulSoup 扫描整个解析页面,识别所有重复的数据(例如,查找文档中的所有链接),只需几行代码就能自动检测特殊字符等编码。

from bs4 import BeautifulSoup

# 假设这是我们从某个网页获取的HTML内容(这里直接以字符串形式给出)

html_content = ““”

示例网页

欢迎来到BeautifulSoup示例

这是一个关于BeautifulSoup的简单示例。

关于我们

““”

# 使用BeautifulSoup解析HTML内容,这里默认使用Python的html.parser作为解析器

# 你也可以指定其他解析器,如'lxml'或'html5lib',但需要先安装它们

soup = BeautifulSoup(html_content, 'html.parser')

# 提取并打印标签的文本内容</p> <p>print(“网页标题:“, soup.title.string) # 网页标题: 示例网页</p> <p># 提取并打印<p>标签的文本内容,这里使用class属性来定位</p> <p>print(“介绍内容:“, soup.find('p', class_='introduction').string) # 介绍内容: 这是一个关于BeautifulSoup的简单示例。</p> <p># 提取并打印<a>标签的href属性和文本内容</p> <p>link = soup.find('a', class_='link')</p> <p>print(“链接地址:“, link['href']) # 链接地址: https://www.example.com/about</p> <p>print(“链接文本:“, link.string) # 链接文本: 关于我们</p> <p># 注意:如果HTML内容中包含多个相同条件的标签,你可以使用find_all()来获取它们的一个列表</p> <p># 例如,要获取所有<a>标签的href属性,可以这样做:</p> <p>all_links = [a['href'] for a in soup.find_all('a')]</p> <p>print(“所有链接地址:“, all_links) # 假设HTML中有多个<a>标签,这里将列出它们的href属性</p> <p># 注意:上面的all_links列表在当前的HTML内容中只有一个元素,因为只有一个<a>标签</p> <p>运行运行</p> <p>2. Scrapy</p> <p>Scrapy是一个流行的高级爬虫框架,可快速高效地抓取网站并从其页面中提取结构化数据。</p> <p>由于 Scrapy 主要用于构建复杂的爬虫项目,并且它通常与项目文件结构一起使用</p> <p>Scrapy 不仅仅是一个库,还可以用于各种任务,包括监控、自动测试和数据挖掘。这个 Python 库包含一个内置的选择器(Selectors)功能,可以快速异步处理请求并从网站中提取数据。</p> <p># 假设这个文件名为 my_spider.py,但它实际上应该放在 Scrapy 项目的 spiders 文件夹中</p> <p>import scrapy</p> <p>class MySpider(scrapy.Spider):</p> <p># Spider 的名称,必须是唯一的</p> <p>name = 'example_spider'</p> <p># 允许爬取的域名列表(可选)</p> <p># allowed_domains = ['example.com']</p> <p># 起始 URL 列表</p> <p>start_urls = [</p> <p>'http://example.com/',</p> <p>]</p> <p>def parse(self, response):</p> <p># 这个方法用于处理每个响应</p> <p># 例如,我们可以提取网页的标题</p> <p>title = response.css('title::text').get()</p> <p>if title:</p> <p># 打印标题(在控制台输出)</p> <p>print(f'Title: {title}')</p> <p># 你还可以继续爬取页面中的其他链接,这里只是简单示例</p> <p># 例如,提取所有链接并请求它们</p> <p># for href in response.css('a::attr(href)').getall():</p> <p># yield scrapy.Request(url=response.urljoin(href), callback=self.parse)</p> <p># 注意:上面的代码只是一个 Spider 类的定义。</p> <p># 要运行这个 Spider,你需要将它放在一个 Scrapy 项目中,并使用 scrapy crawl 命令来启动爬虫。</p> <p># 例如,如果你的 Scrapy 项目名为 myproject,并且你的 Spider 文件名为 my_spider.py,</p> <p># 那么你应该在项目根目录下运行以下命令:</p> <p># scrapy crawl example_spider</p> <p>3. Selenium</p> <p>Selenium 是一款基于浏览器地自动化程序库,可以抓取网页数据。它能在 JavaScript 渲染的网页上高效运行,这在其他 Python 库中并不多见。</p> <p>在开始使用 Python 处理 Selenium 之前,需要先使用 Selenium Web 驱动程序创建功能测试用例。</p> <p>Selenium 库能很好地与任何浏览器(如 Firefox、Chrome、IE 等)配合进行测试,比如表单提交、自动登录、数据添加/删除和警报处理等。</p> <p>from selenium import webdriver</p> <p>from selenium.webdriver.common.keys import Keys</p> <p>from selenium.webdriver.common.by import By</p> <p>from selenium.webdriver.support.ui import WebDriverWait</p> <p>from selenium.webdriver.support import expected_conditions as EC</p> <p># 设置WebDriver的路径(根据你的系统路径和WebDriver版本修改)</p> <p>driver_path = '/path/to/your/chromedriver'</p> <p># 初始化WebDriver</p> <p>driver = webdriver.Chrome(executable_path=driver_path)</p> <p>try:</p> <p># 打开网页</p> <p>driver.get('https://www.example.com')</p> <p># 等待页面加载完成(这里使用隐式等待,针对所有元素)</p> <p># 注意:隐式等待可能会影响性能,通常在脚本开始时设置一次</p> <p>driver.implicitly_wait(10) # 秒</p> <p># 查找并输入文本到搜索框(假设搜索框有一个特定的ID或类名等)</p> <p># 这里以ID为'search'的输入框为例</p> <p>search_box = driver.find_element(By.ID, 'search')</p> <p>search_box.send_keys('Selenium WebDriver')</p> <p># 提交搜索(假设搜索按钮是一个类型为submit的按钮或是一个可以点击的输入框)</p> <p># 如果搜索是通过按Enter键触发的,可以直接在search_box上使用send_keys(Keys.ENTER)</p> <p># 这里假设有一个ID为'submit'的按钮</p> <p>submit_button = driver.find_element(By.ID, 'submit')</p> <p>submit_button.click()</p> <p># 等待搜索结果加载完成(这里使用显式等待作为示例)</p> <p># 假设搜索结果页面有一个特定的元素,我们等待它出现</p> <p>wait = WebDriverWait(driver, 10) # 等待最多10秒</p> <p>element = wait.until(EC.presence_of_element_located((By.ID, 'results')))</p> <p># 执行其他操作…</p> <p>finally:</p> <p># 关闭浏览器</p> <p>driver.quit()</p> <p>4. requests</p> <p>不用多说,requests 是 Python 中一个非常流行的第三方库,用于发送各种 HTTP 请求。它简化了 HTTP 请求的发送过程,使得从网页获取数据变得非常简单和直观。</p> <p>requests 库提供了丰富的功能和灵活性,支持多种请求类型(如 GET、POST、PUT、DELETE 等),可以发送带有参数、头信息、文件等的请求,并且能够处理复杂的响应内容(如 JSON、XML 等)。</p> <p>import requests</p> <p># 目标URL</p> <p>url = 'https://httpbin.org/get'</p> <p># 发送GET请求</p> <p>response = requests.get(url)</p> <p># 检查请求是否成功</p> <p>if response.status_code == 200:</p> <p># 打印响应内容</p> <p>print(response.text)</p> <p>else:</p> <p># 打印错误信息</p> <p>print(f'请求失败,状态码:{response.status_code}')</p> <p>5. urllib3</p> <p>urllib3 是 Python内置网页请求库,类似于 Python 中的requests库,主要用于发送HTTP请求和处理HTTP响应。它建立在Python标准库的urllib模块之上,但提供了更高级别、更健壮的API。</p> <p>urllib3可以用于处理简单身份验证、cookie 和代理等复杂任务。</p> <p>import urllib3</p> <p># 创建一个HTTP连接池</p> <p>http = urllib3.PoolManager()</p> <p># 目标URL</p> <p>url = 'https://httpbin.org/get'</p> <p># 使用连接池发送GET请求</p> <p>response = http.request('GET', url)</p> <p># 检查响应状态码</p> <p>if response.status == 200:</p> <p># 打印响应内容(注意:urllib3默认返回的是bytes类型,这里我们将其解码为str)</p> <p>print(response.data.decode('utf-8'))</p> <p>else:</p> <p># 如果响应状态码不是200,则打印错误信息</p> <p>print(f'请求失败,状态码:{response.status}')</p> <p># 注意:urllib3没有直接的方法来处理JSON响应,但你可以使用json模块来解析</p> <p># 如果响应内容是JSON,你可以这样做:</p> <p># import json</p> <p># json_response = json.loads(response.data.decode('utf-8'))</p> <p># print(json_response)</p> <p>6. lxml</p> <p>lxml是一个功能强大且高效的Python库,主要用于处理XML和HTML文档。它提供了丰富的API,使得开发者可以轻松地读取、解析、创建和修改XML和HTML文档。</p> <p>from lxml import etree</p> <p># 假设我们有一段HTML或XML内容,这里以HTML为例</p> <p>html_content = ““”</p> <p><html></p> <p><head></p> <p><title>示例页面

欢迎来到我的网站

这是一个使用lxml解析的示例页面。

  • 项目1
  • 项目2

““”

# 使用lxml的etree模块来解析HTML或XML字符串

# 注意:对于HTML内容,我们使用HTMLParser解析器

parser = etree.HTMLParser()

tree = etree.fromstring(html_content, parser=parser)

# 查找并打印标签的文本</p> <p>title = tree.find('.//title').text</p> <p>print(“页面标题:“, title)</p> <p># 查找并打印class为"description"的<p>标签的文本</p> <p>description = tree.find('.//p[@class=“description”]').text</p> <p>print(“页面描述:“, description)</p> <p># 查找所有的<li>标签,并打印它们的文本</p> <p>for li in tree.findall('.//li'):</p> <p>print(“列表项:“, li.text)</p> <p># 注意:lxml也支持XPath表达式来查找元素,这里只是简单展示了find和findall的用法</p> <p># XPath提供了更强大的查询能力</p> <p>其他爬虫工具</p> <p>除了Python库之外,还有其他爬虫工具可以使用。</p> <p>八爪鱼爬虫</p> <p>八爪鱼爬虫是一款功能强大的桌面端爬虫软件,主打可视化操作,即使是没有任何编程基础的用户也能轻松上手。</p> <p>官网:https://affiliate.bazhuayu.com/hEvPKU</p> <p>八爪鱼支持多种数据类型采集,包括文本、图片、表格等,并提供强大的自定义功能,能够满足不同用户需求。此外,八爪鱼爬虫支持将采集到的数据导出为多种格式,方便后续分析处理。</p> </blockquote> <h1>2.正式爬虫</h1> <p>1.导入所需库</p> <pre><code>import requests from lxml import etree </code></pre> <p>2. 指定翻页逻辑</p> <p><img src="/upload/image-exbf.png" alt="" /></p> <p>翻页后</p> <p><img src="/upload/image-dysj.png" alt="" /></p> <pre><code># 翻页逻辑 for i in range(1,11): url = 'https://ssr1.scrape.center/page/{}'.format(i) </code></pre> <p>3. 获取总览</p> <p>右键如下👇 点击检查</p> <p><img src="/upload/image-qozh.png" alt="" /></p> <p>后出现</p> <p><img src="/upload/image-aery.png" alt="" /></p> <p>点击</p> <p><img src="/upload/image-iugd.png" alt="" /></p> <p>选择如图所示,点击</p> <p><img src="/upload/image-pwaw.png" alt="" /></p> <pre><code># 爬虫逻辑 count = 1 # 计数 data = requests.get(url) datas = etree.HTML(data.content) a = datas.xpath('/html/body/div/div[2]/div[1]/div[1]/div') for i in a: scyx = { "序号": count, "img": ",".join(i.xpath('.//div[@class="el-card__body"]//a/img/@src')), "title" : ",".join(i.xpath('.//div[@class="el-card__body"]//a/h2/text()')), "type" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="categories"]//span/text()')), "conutry" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][1]//span[1]/text()')), "price" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="el-row"]//div//p[@class="score m-t-md m-b-n-sm"]/text()')).replace("\n ",""), "date" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][1]//span[3]/text()')), "time" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][2]//span/text()')) } print(scyx) count += 1 </code></pre> <h1>3.完整代码分析</h1> <pre><code>import requests from lxml import etree import pandas as pd data_list = [] count = 1 # 计数 # 翻页逻辑 for i in range(1,11): url = 'https://ssr1.scrape.center/page/{}'.format(i) # 爬虫逻辑 data = requests.get(url) datas = etree.HTML(data.content) a = datas.xpath('/html/body/div/div[2]/div[1]/div[1]/div') for i in a: count += 1 scyx = { "序号": count, "img": ",".join(i.xpath('.//div[@class="el-card__body"]//a/img/@src')), "title" : ",".join(i.xpath('.//div[@class="el-card__body"]//a/h2/text()')), "type" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="categories"]//span/text()')), "conutry" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][1]//span[1]/text()')), "price" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="el-row"]//div//p[@class="score m-t-md m-b-n-sm"]/text()')).replace("\n ",""), "date" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][1]//span[3]/text()')), "time" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][2]//span/text()')) } print(scyx) data_list.append(scyx) pd.DataFrame(data_list).to_csv('movie.csv',index=False) import requests --导入requests库 from lxml import etree --从lxml库中导入etree import pandas as pd --导入pandas库 data_list = [] --创建一个空列表,用于存储最后的数据 count = 1 # 计数 --用于最终序号的计数 for i in range(1,11): --翻页逻辑,从第一页翻到第10页 url = 'https://ssr1.scrape.center/page/{}'.format(i) -- 获取URL,根据翻页逻辑编写翻页代码 # 爬虫逻辑 data = requests.get(url) -- 使用requests库在网页中获取数据 datas = etree.HTML(data.content) --将网页元数据转换为xpath可读形式 a = datas.xpath('/html/body/div/div[2]/div[1]/div[1]/div') --获取数据列表的总览 for i in a: -- 将各个总览分隔为一个个列表 count += 1 --每次循环计数加1 scyx = { -- 创建字典存储获取的数据 "序号": count, "img": ",".join(i.xpath('.//div[@class="el-card__body"]//a/img/@src')), "title" : ",".join(i.xpath('.//div[@class="el-card__body"]//a/h2/text()')), "type" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="categories"]//span/text()')), "conutry" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][1]//span[1]/text()')), "price" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="el-row"]//div//p[@class="score m-t-md m-b-n-sm"]/text()')).replace("\n ",""), "date" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][1]//span[3]/text()')), "time" : ",".join(i.xpath('.//div[@class="el-card__body"]//div[@class="m-v-sm info"][2]//span/text()')) } data_list.append(scyx) --追加到空列表中 pd.DataFrame(data_list).to_csv('movie.csv',index=False) --使用pandas快速将列表中的内容放到csv文件中 </code></pre>

LICENSED UNDER CC BY-NC-SA 4.0