(五)爬取项目数据集

2021SC@SDUSC

简介

根据项目进度安排,需要爬取百度学术生成数据集来测试不同模型的性能表现。然而在实际爬取时遇到了例如页面重复、页面无法访问等问题。

页面重复问题描述及解决方案

在爬取结束后发现出现了大量的重复页面,一方面浪费了大量时间,另一方面去重需要花费额外的经历。起初,我尝试将页面的第一篇论文题目作为该页面的唯一标识,通过集合来去重,然而这种方式依然无法避免时间浪费的问题。

通过对于算法和百度文库的进一步分析,问题源头逐渐浮出水面。在最初的爬虫程序中有一个page_num参数,表示期望爬取的页面数量。通过对url中“pn=?”的替换实现了对所有检索的遍历。

next_page = fir_page.replace("pn=10", "pn={:d}".format(i * 10))

然而部分关键词的检索结果达不到page_num的数值,例如搜索“检索”只有68页

在这里插入图片描述

当pn=?的数值超过临界值时,百度学术的处理方式是回退到第一页,然后继续爬取,正因上述机制,出现了页面重复的问题。

为了解决该问题,我对页面进行了进一步分析。当页面存在下一页是会由一个右箭头,如图:

在这里插入图片描述

可以对页面进行分析来确定是否存在右箭头,如果存在右箭头,那么可以继续遍历,逻辑如下:

next_icon_soup = soup_new.find(id='page')
            if next_icon_soup == None:
                # 为none时整个页面都为none
                print('None_for_next')
                continue
            next_icon_soup2 = next_icon_soup.find_all('a')[-1].find(class_='c-icon-pager-next')
            if next_icon_soup2 == None:
                break

然而在解决该问题时我发现在访问某些页面时返回结果是乱码,此时next_icon_soup2一定为None,即便存在下一页也被迫退出。因此我首先获取next_icon_soup2的父元素,如果父元素不存在,那么一定说明返回结果是乱码,将该页忽略。

页面无法访问问题描述及解决方案

正如前文所提到的,在访问某些页面时返回结果可能为乱码,这对去重也造成了一定的困难,只是单纯的忽略会造成大量数据丢失。引起该问题的根源可能是网站的反爬虫机制,因此最初的想法是每次爬取后睡眠1s来避免被发现,然而效果并不理想。

进一步分析,我尝试对无法访问的页面更换爬虫的访问头,更换后正常访问。基于此,我采取了如下机制:首先使用请求头A进行爬取,如果返回为乱码,更换请求头B,如果仍为乱码再次更换请求头A,因此类推,当更换超过10次仍不能访问后,放弃该页面。采取此机制大多数页面均可正常爬取。

接下来的问题是如何判断爬取的结果为乱码。经过分析,我发现乱码的页面有一个元素类名为“timeout-img”,当页面中出现该元素时,将该页面判定为无法访问的页面。

time_out = soup_new.find(class_='timeout-img')
            if time_out_num > 10:
                fail_num += 1
                flag = False
                print('fail...')
                break

该部分整体实现如下:

        while time_out != None:
            time_out_num += 1
            time.sleep(1)
            print(next_page)
            print(' timeout...')
            response = requests.get(next_page,headers = headers2)
            soup_new = BeautifulSoup(response.text, "lxml")
            # 检查是否超时
            time_out = soup_new.find(class_='timeout-img')
            if time_out_num > 10:
                fail_num += 1
                flag = False
                print('fail...')
                break

小结

解决了上述问题后,爬虫正常运行并构建了符合要求的数据集。

运行结果如下(关键词:牛肉):

在这里插入图片描述

部分数据集截图如下:
在这里插入图片描述

完整代码:

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import pandas as pd
import requests
import re
from collections import defaultdict

headers = {
   
   'Use
### 如何爬取旅游相关的数据集 为了实现对旅游相关数据集爬取,可以从以下几个方面入手: #### 数据源的选择 在进行数据爬取前,需明确目标数据的具体来源。以下是几个可能的数据源选项[^3]: - **携程、去哪儿等在线旅游平台**:这些平台上包含了丰富的酒店、航班、景点门票等相关信息。 - **Kaggle**:作为一个知名的数据科学社区,Kaggle 提供了许多公开可用的旅游主题数据集,涵盖了用户评价、目的地偏好等多个维度。 - **政府开放数据平台**:许多国家和地区都设有官方的开放数据门户,例如中国的政府开放数据平台或美国的 data.gov,其中涉及旅游业的相关统计资料。 #### 技术工具准备 针对不同类型的网页结构设计合适的抓取策略至关重要。通常需要用到如下几种关键技术栈[^1]: - Python 编程语言及其生态中的 requests 库用于发起 HTTP 请求;BeautifulSoup 或 lxml 用来解析 HTML 文档内容; - Selenium 可模拟浏览器行为访问动态加载页面; - Scrapy 是一个功能强大的框架,特别适用于构建大规模网络爬虫项目。 #### 实际操作案例分享 下面给出一段简单的代码示例展示如何利用 Requests 和 BeautifulSoup 来获取某个特定 URL 下的内容并提取有用的信息片段: ```python import requests from bs4 import BeautifulSoup def fetch_travel_data(url): headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 假设我们要找的是所有的景点名称标签 attractions = [] for item in soup.select('.attraction-name'): attractions.append(item.getText()) return attractions url = "http://example-travel-site.com" print(fetch_travel_data(url)) ``` 此脚本定义了一个函数 `fetch_travel_data` ,它接受一个网址作为参数,发送 GET 请求到该地址,并使用 BeautifulSoup 解析返回的结果。然后遍历所有匹配 CSS 类名为 `.attraction-name` 的元素节点,收集它们内部的文字内容形成列表最后打印出来。 另外还有更复杂的场景比如当面对 JavaScript 渲染后的界面时,则需要借助像 Puppeteer 这样的 Node.js 模块或者继续坚持用 Pyppeteer(基于 Chromium 浏览器自动化控制)来完成任务[^2]. 需要注意的是,在实际开发过程中还应该考虑诸如反爬机制规避措施、异常处理逻辑完善等方面的工作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值