当前位置:
首页 > Python基础教程 >
-
爬虫(十七):Scrapy框架(四) 对接selenium爬取京东商品数据(2)
page)
submit.click() # 点击按钮
time.sleep(5)
# 判断当前页码出现在了输入的页面中,EC.text_to_be_present_in_element 判断元素在指定字符串中出现
self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.curr'),str(page)))
# 等待 #J_goodsList 加载出来,为页面数据,加载出来之后,在返回网页源代码
self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#J_bottomPage > span.p-num > a.curr'),str(page)))
return HtmlResponse(url=request.url, body=self.browser.page_source, request=request, encoding='utf-8',status=200)
except TimeoutException:
return HtmlResponse(url=request.url, status=500, request=request)
首先我在__init__()里对一些对象进行初始化,包括WebDriverWait等对象,同时设置页面大小和页面加载超时时间。在process_request()方法中,我们通过Request的meta属性获取当前需要爬取的页码,将页码赋值给input变量,再将翻页的点击按钮框赋值给submit变量,然后在数据框中输入页码,等待页面加载,直接返回htmlresponse给spider解析,这里我们没有经过下载器下载,直接构造response的子类htmlresponse返回。(当下载器中间件返回response对象时,更低优先级的process_request将不在执行,转而执行其他的process_response()方法,本例中没有其他的process_response(),所以直接将结果返回给spider解析。)
1.4 解析页面
Response对象就会回传给Spider内的回调函数进行解析。所以下一步我们就实现其回调函数,对网页来进行解析。
- def parse(self, response):
- soup = BeautifulSoup(response.text, 'lxml')
- lis = soup.find_all(name='li', class_="gl-item")
- for li in lis:
- proc_dict = {}
- dp = li.find(name='span', class_="J_im_icon")
- if dp:
- proc_dict['dp'] = dp.get_text().strip()
- else:
- continue
- id = li.attrs['data-sku']
- title = li.find(name='div', class_="p-name p-name-type-2")
- proc_dict['title'] = title.get_text().strip()
- price = li.find(name='strong', class_="J_" + id)
- proc_dict['price'] = price.get_text()
- comment = li.find(name='a', id="J_comment_" + id)
- proc_dict['comment'] = comment.get_text() + '条评论'
- url = 'https://item.jd.com/' + id + '.html'
- proc_dict['url'] = url
- proc_dict['type'] = 'JINGDONG'
- yield proc_dict
这里我们采用BeautifulSoup进行解析,匹配所有商品,随后对结果进行遍历,依次选取商品的各种信息。
1.5 储存结果
提取完页面数据之后,数据会发送到item pipeline处进行数据处理,清洗,入库等操作,所以我们此时当然需要定义项目管道了,在此我们将数据存储在mongodb数据库中。
- # -*- coding: utf-8 -*-
- # Define your item pipelines here
- #
- # Don't forget to add your pipeline to the ITEM_PIPELINES setting
- # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
- import pymongo
- class MongoPipeline(object):
- def __init__(self,mongo_url,mongo_db,collection):
- self.mongo_url = mongo_url
- self.mongo_db = mongo_db
- self.collection = collection
- @classmethod
- #from_crawler是一个类方法,由 @classmethod标识,是一种依赖注入的方式,它的参数就是crawler
- #通过crawler我们可以拿到全局配置的每个配置信息,在全局配置settings.py中的配置项都可以取到。
- #所以这个方法的定义主要是用来获取settings.py中的配置信息
- def from_crawler(cls,crawler):
- return cls(
- mongo_url=crawler.settings.get('MONGO_URL'),
- mongo_db = crawler.settings.get('MONGO_DB'),
- collection = crawler.settings.get('COLLECTION')
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式