手把手带你搭建推荐系统
黄鸿波
谷歌开发者专家,知名游戏公司技术专家
3434 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
手把手带你搭建推荐系统
15
15
1.0x
00:00/00:00
登录|注册

08|数据获取:如何使用Scrapy框架爬取新闻数据?

你好,我是黄鸿波。
上一节课,我们对 Scrapy 框架有了一个整体的了解,也实际地安装了 Scrapy 库并搭建了一个基础的 Scrapy 工程。这节课,我们就继续在这个工程的基础上爬取新浪新闻中的数据,并对爬取到的数据进行解析。

使用 Scrapy 框架抓取数据

我们首先打开 sina\sina\spider 下面的 sina_spider.py 文件,在这个文件中,Scrapy 框架给我们写了一个基础的框架代码。
import scrapy
class SinaSpiderSpider(scrapy.Spider):
name = 'sina_spider'
allowed_domains = ['sina.com.cn']
start_urls = ['http://sina.com.cn/']
def parse(self, response):
pass
这段代码主要是对整个爬虫程序做了一个简单的定义,定义了爬虫的名字为“sina_spider”,爬取的域名为“sina.com.cn”,爬取的 URL 是“http://sina.com.cn/”。最后它还贴心地帮我们定义了一个解析函数,这个解析函数的入参就是服务器返回的 response 值。现在,我们要开始分析我们要爬取的内容,并对这个函数进行改写。

页面分析

我们先以网易的国内新闻为例来分析一下。我们先看下面这个界面。
我们要分析的是界面里最新新闻这个部分。可以看到这个新闻列表中一共包含了下面这几部分:标题、摘要、时间、关键词。我们还可以看到,时间在 1 小时之内的会显示为“XX 分钟前”,在 1 小时以上的会显示今天具体的某个时间点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了使用Scrapy框架和Selenium库爬取新闻数据的方法。作者首先介绍了Scrapy框架的基本框架代码和页面结构分析,然后详细讲解了使用Selenium库进行浏览器页面访问工作,并给出了相应的代码示例。在爬取列表部分,作者使用Selenium库模拟浏览器操作,获取新闻标题和时间,并对时间进行了进一步处理。此外,文章还介绍了如何爬取详情页信息,并通过实际代码示例和详细的步骤说明,帮助读者了解了如何使用Scrapy框架和Selenium库进行新闻数据的爬取。文章还提到了在Chrome浏览器中使用开发者工具查看页面元素、Scrapy提供的内置解析器、callback函数返回多个请求以及item.py文件的用法。最后,文章提出了课后题,鼓励读者跟着讲解实现所学内容,并爬取新浪网站电影板块的内容。整体而言,本文内容丰富,技术性强,对于想要学习新闻数据爬取的读者具有一定的实用性和指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你搭建推荐系统》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • Geek_ccc0fd
    新安装selemium的API变了,而且xpath获取的路径有点问题,我这里获取不到一页的全部内容,我修改了一下: title = driver.find_elements(By.XPATH, "//div[@class='feed-card-item']/h2/a[@target='_blank']") time = driver.find_elements(By.XPATH,"//div[@class='feed-card-item']/h2/../div[@class='feed-card-a feed-card-clearfix']/div[@class='feed-card-time']") 然后就是翻页点击那里我这边跑下来也有问题,根据xpath会获取两个a标签,所以需要增加索引: driver.find_elements(By.XPATH,"//div[@class='feed-card-page']/span[@class='pagebox_next']/a")[0].click()

    作者回复: 感谢分享您的经验。确实,Selenium 的 API 有时候会进行更新,需要根据新版本来进行调整。在具体实现中,我们需要结合页面的 HTML 结构来进行 xpath 路径的选择,以确保能够定位到正确的元素。对于一些可能存在多个元素的情况,使用索引可以确保点击到正确的元素,避免影响程序的正常执行。

    2023-05-06归属地:广东
    2
  • 未来已来
    截止到 5月3日,新安装的 selemium 只有 find_elements 方法,老师的代码需改为: `title = driver.find_elements(By.XPATH, "//h2[@class='undefined']/a[@target='_blank']")` `time = driver.find_elements(By.XPATH, "//h2[@class='undefined']/../div[@class='feed-card-a feed-card-clearfix']/div[@class='feed-card-time']")` 以此类推

    作者回复: 感谢提醒,后续我会统一修改一下。

    2023-05-03归属地:广东
    2
    1
  • Abigail
    应该设计一个简单点的例子, python 起码也要用 3.9 啊

    作者回复: 实际上,这个版本相对来讲是通用的,可以用3.9版本来开发

    2023-10-24归属地:澳大利亚
  • alexliu
    在运行下一页click()的时候,有可能出现ElementNotInteractableException错误,解决方案: 1、在driver.get(response.url)和click()后添加延时time.sleep(2) 2、保持chrome的窗口大小一致 self.option.add_argument("--window-size=1960,1080") try... except...部分代码如下: try: _next = driver.find_elements(By.XPATH, "//div[@class='feed-card-page']/span[@class='pagebox_next']/a") _next[0].click() _time.sleep(2) except StaleElementReferenceException as e: print(" page failed.", e) _next = driver.find_elements(By.XPATH, "//div[@class='feed-card-page']/span[@class='pagebox_next']/a") _next[0].click() _time.sleep(2) except ElementNotInteractableException as e: print(" not found page.", e) break except Exception as e: print("unkwon error: ", e)

    作者回复: 这个很有可能是你的服务接口部署的问题。

    2023-06-01归属地:上海
  • Geek_ccc0fd
    我们在parse里面可以直接使用response.xpath获取元素,和使用 driver.find_elements是同样的效果,为什么还要用selenium来做浏览器的操作呢?

    作者回复: 虽然在 Scrapy 中可以通过 `response.xpath` 直接获取网页元素,但是有时候网页内容是通过 JavaScript 动态加载的,此时 Scrapy 可能无法获取这些需要 JavaScript 执行后才能得到的内容。 而使用 Selenium 就可以完全模拟浏览器行为,包括 JavaScript 的执行,可以获取到完整的网页内容。此外,某些网站会通过一些反爬虫技术来检测访问者是否是真正的浏览器,如果检测到是爬虫,则会拒绝访问。使用 Selenium 可以完美地解决这个问题。

    2023-05-06归属地:广东
  • 安菲尔德
    请问哪有main.py文件呢,没有看到

    作者回复: 同学,你好。 main.py文件是需要自己创建的。

    2023-05-02归属地:天津
  • peter
    Q3:源码放在什么地方啊?能否把源码集中放到一个公共地方? 比如github等。

    作者回复: 同学你好,节后我会把源码放在github上,然后给你们链接。

    2023-04-26归属地:北京
  • peter
    Q1:第七课,创建环境的最后几步,不停出错,最后一个错误是:执行“scrapy genspider sina_spider sina.com.cn”,报告:lib\string.py", line 132, in substitute return self.pattern.sub(convert, self.template) TypeError: cannot use a string pattern on a bytes-like object 网上搜了,大意说是python2和python3不匹配导致的。 我是完全按照老师的步骤来安装的,安装的是pythno3,怎么会有python2呢?当然,这个文件还没有解决,进行不下去了,郁闷啊。 Q2:能否建一个微信群?遇到问题可以协商。 另外,老师能否更及时地回复留言?

    作者回复: 关于第一个问题,看看能不能通过截图或者其他方式告诉我,关于微信群,我可以和官方商量一下,看看怎么搞。

    2023-04-26归属地:北京
    3
  • GAC·DU
    老师,关于代码有些疑惑,第一:为什么parse_namedetail方法不再使用driver发起http请求和获取html标签内容? 第二:desc = response.xpath("//div[@class='article']/p/text()").extract() desc = selector.xpath("//div[@class='article']/p/text()").extract() 我测试了两个代码都可以使用,那为什么不直接使用response,反而要生成一个selector?

    作者回复: 同学你好,我来回答你的两个问题: A1:因为在parse_namedetail中已经获取到了http响应的内容,所以可以直接用,而不是再次请求网络,请求网络会有更多的耗时; A2:response对象包含来自Web服务器的HTML响应,并可用于提取响应数据,而selector对象是使用response对象创建的,它提供了一种方便的方法来从响应中选择和提取数据。因此,使用selector而不是response可以更方便地从HTML响应中提取和处理数据。

    2023-04-26归属地:北京
  • Weitzenböck
    如果出现这个错误:__init__() got an unexpected keyword argument 'chrome_options' 代码里改为 driver = webdriver.Chrome(options=self.option)具体源码是: class WebDriver(ChromiumDriver): """Controls the ChromeDriver and allows you to drive the browser.""" def __init__( self, options: Options = None, service: Service = None, keep_alive: bool = True, ) -> None: """Creates a new instance of the chrome driver. Starts the service and then creates new instance of chrome driver. :Args: - options - this takes an instance of ChromeOptions - service - Service object for handling the browser driver if you need to pass extra details - keep_alive - Whether to configure ChromeRemoteConnection to use HTTP keep-alive. """ self.service = service if service else Service() self.options = options if options else Options() self.keep_alive = keep_alive self.service.path = DriverFinder.get_path(self.service, self.options) super().__init__( DesiredCapabilities.CHROME["browserName"], "goog", self.options, self.service, self.keep_alive, )
    2023-06-15归属地:江苏
    1
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部