08|数据获取:如何使用Scrapy框架爬取新闻数据?
使用 Scrapy 框架抓取数据
页面分析
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了使用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归属地:广东21 - 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归属地:天津 - peterQ3:源码放在什么地方啊?能否把源码集中放到一个公共地方? 比如github等。
作者回复: 同学你好,节后我会把源码放在github上,然后给你们链接。
2023-04-26归属地:北京 - peterQ1:第七课,创建环境的最后几步,不停出错,最后一个错误是:执行“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