直接上淘宝网(网页淘宝登录电脑版)

使用Selenium爬取淘宝商品(绕过登录页面)使用Selenium模拟浏览器操作,抓取淘宝商品信息,并将结果保存到MongoDB。1.准备工作本文以Chrom

使用Selenium爬取淘宝商品(绕过登录页面)

使用Selenium模拟浏览器操作,抓取淘宝商品信息,并将结果保存到MongoDB。

1.准备工作

本文以Chrome为例说明硒的用法。开始之前,请确保Chrome浏览器安装正确,ChromeDriver已配置;此外,还需要正确安装Python的Selenium库。

2.界面分析

首先,我们打开淘宝的界面,观察它的ajax请求。

打开淘宝页面,搜索商品,比如ipad,然后打开开发者工具,查看Ajax请求。我们可以发现根本没有Ajax请求,如下图所示。

直接上淘宝网(网页淘宝登录电脑版)

然而,这并不重要。我们可以直接用Selenium来模拟浏览器,你在浏览器里看到什么都可以抓取。这就是我们选择硒的原因。

3.页面分析

我们的目标是抓取商品信息。如图,是商品条目,包含了商品的基本信息,包括商品图片、名称、价格、购买人数、店铺名称、店铺位置。我们要做的就是获取所有这些信息。

直接上淘宝网(网页淘宝登录电脑版)

抓取是淘宝的搜索页面,直接构造参数就可以进入这个链接。例如,如果你搜索ipad,你可以直接访问https://s.taobao.com/search?。Q=ipad,在首页呈现搜索结果,如图。

直接上淘宝网(网页淘宝登录电脑版)

在页面底部有一个分页导航,其中既有前五页的链接,也有下一页的链接,还有输入任意页码跳转的链接,如图。

直接上淘宝网(网页淘宝登录电脑版)

这里的商品搜索结果一般最多100页。要得到每一页的内容,只需要遍历从1到100的页码,页码的个数是一定的。因此,直接在页面跳转文本框中输入要跳转的页码,然后点击确定即可跳转到该页码对应的页面。

这里不直接点击“下一步”的原因是:一旦在抓取过程中异常退出,比如点击“下一步”时,无法快速切换到相应的后续页面。此外,在抓取过程中,还需要记录当前页码,当点击“下一步”后页面加载失败时,还需要做异常检测,检测当前页面加载到了哪个页面。整个过程比较复杂,所以我们这里直接用跳转的方法抓取页面。

当我们成功加载一页商品列表时,可以使用Selenium获取页面源代码,然后使用相应的解析库进行解析。这里,我们使用pyquery来解析。让我们用代码来实现整个抓取过程。

4.获得货物清单

首先,你需要构建一个抓取的URL:https://s.taobao.com/search?. q = ipad .这个URL非常简洁,参数Q就是要搜索的关键词。只要改变这个参数,就可以得到不同的商品列表。这里我们把一个商品的关键词定义为一个变量,然后构造这样一个URL。

那么你需要用硒来抓。我们实现了以下方法来抓取列表页面:

从selenium导入web driver from selenium . common . exceptions导入超时exception from selenium . web driver . common . by导入Byfrom selenium.webdriver。支持import expected _ conditions as EC from selenium . web driver . support . wait import web driver wait from URL lib . parse import quote time browser = we b driver。chrome()wait = WebDriverWait(browser,10)KEYWORD = & # 39;ipad & # 39def index_page(第页):& # 34;""抓取索引页:param page:页码& # 34;""打印(& # 39;攀登第& # 39;,第页,& # 39;第&#39页;)试试:url = & # 39https://s.taobao.com/search? q = & # 39;+quote(关键字)browser . get(URL)if page & gt;1:input = wait . until(EC . presence _ of _ element _ located((By。CSS_SELECTOR,& # 39;# main RP-pager div . form & gt;输入& # 39;)))submit = wait . until(EC . element _ to _ be _ clickable((By。CSS_SELECTOR,& # 39;# main RP-pager div . form & gt;span . BTN . j _ Submit & # 39;)))input . clear()input . send _ keys(page)submit . click()wait . until(EC . text _ to _ be _ present _ in _ element((By。CSS_SELECTOR,& # 39;# main RP-pager Li . item . active & gt;span & # 39),str(page)))wait . until(EC . presence _ of _ element _ located((By .CSS_SELECTOR,& # 39;。m-项目列表。项目。item & # 39)))Get _ products () except超时异常:index _ page (page)这里首先构造一个WebDriver对象,使用的浏览器是Chrome。然后指定一个关键字,比如ipad,然后定义index_age()方法,用来抓取产品列表页面。

在这个方法中,我们首先访问搜索产品的链接,然后判断当前页码。如果它大于1,我们将跳过页面,否则,我们将等待页面加载。

等待时,我们使用WebDriverWait对象,它可以指定等待条件和最大等待时间,这里是10s。如果在此时间内等待条件匹配成功,也就是说页面元素加载成功,将立即返回相应的结果并继续向下执行;否则,当最大等待时间未加载时,将直接抛出超时异常。

例如,当我们最终必须等待加载商品信息时,我们指定presnece_of_element_located的条件,然后引入选择器。m-项目列表。项目。项,而这个选择器对应的页面内容就是每个商品的信息块,可以在网页中查看。如果加载成功,将执行后续的get_products()方法来提取产品信息。

关于翻页操作,这里先获取页码输入框,赋值给input,然后获取“确定”按钮,赋值给submit,就是图中的两个元素。

直接上淘宝网(网页淘宝登录电脑版)

首先我们清除了空输入框,然后就可以调用clear()方法了。然后,调用send_keys()方法在输入框中填充页码,然后点击OK按钮。

那么,怎么知道自己有没有跳转到对应的页码呢?我们可以注意到,成功跳转到一个页面后,页码会高亮显示,如图。

直接上淘宝网(网页淘宝登录电脑版)

我们只需要判断当前高亮显示的页码就是当前页码,那么这里使用了另一个等待条件text_to_be_present_in_element,它会等待指定的文本出现在某个节点并返回成功。这里我们通过参数将高亮显示的页码节点和当前要跳转的页码对应的CSS选择器传递给这个等待条件,这样它会检测当前高亮显示的页码节点是否是我们传递的页码。如果是,则证明页面成功跳转到该页面,页面跳转成功。

这样,刚刚实现的index_page()方法就可以传入对应的页码。加载了对应页码的商品列表后,调用get_products()方法解析页面。

5.分析商品清单。

接下来,我们可以实现get_products()方法来解析商品列表。这里我们直接获取页面的源代码,然后用pyquery解析,实现如下:

from pyquery import PyQuery as pqdef get_products(): """ 提取商品数据 """ html = browser.page_source doc = pq(html) items = doc('#mainsrp-itemlist .items .item').items() for item in items: product = { 'image':item.find('.pic .img').attr('data-src'), 'price':item.find('.price').text(), 'deal':item.find('.deal-cnt').text(), 'title':item.find('.title').text(), 'shop':item.find('.shop').text(), 'location':item.find('.location').text() } print(product) save_to_mongo(product)

首先,调用page_source属性获取页码的源代码,然后构造了PyQuery对象,提取了商品列表,此时使用的CSS选择器是#mainsrp-itemlist .items .item,它会匹配整个页面的每个商品。它的匹配结果是多个,所以这里我们又对它进行了一次遍历,用for循环将每个结果分别进行解析,每次循环把它赋值为item变量,每个item变量都是一个PyQuery对象,然后再调用它的find()方法,传入CSS选择器,就可以获取单个商品的特定内容。从pyquery导入PyQuery作为pqdef get _ products():& # 34;""提取商品数据& # 34;""html = browser . page _ source doc = pq(html)items = doc(& # 39;# main RP-item list。项目。item & # 39).items:product = { & # 39;图像& # 39;:item . find(& # 39;。图片。img & # 39).attr(& # 39;数据-src & # 39;), '价格& # 39;:item . find(& # 39;。价格& # 39;).text(),& # 39;交易& # 39;:item . find(& # 39;。deal-CNT & # 39;).text(),& # 39;标题& # 39;:item . find(& # 39;。标题& # 39;).text(),& # 39;商店& # 39;:item . find(& # 39;。商店& # 39;).text(),& # 39;位置& # 39;:item . find(& # 39;。位置& # 39;).text()} print(product)save _ to _ mongo(product)首先调用page_source属性获取页码的源代码,然后构造一个PyQuery对象,提取商品列表。此时使用的CSS选择器是#mainsrp-itemlist。项目。item,它将匹配整个页面上的所有商品。它的匹配结果有多个,这里我们再遍历一遍,用for循环分别解析每个结果,在每个循环中赋给一个item变量,每个item变量都是一个PyQuery对象,然后调用它的find()方法,传入CSS selector,得到单个商品的具体内容。

比如查商品源代码。

直接上淘宝网(网页淘宝登录电脑版)

可以发现,它是一个img节点,包含id、class、data-src、alt和src属性,这里之所以可以看到这样图片,是因为它的src属性被赋值为图片的URL。把它的src属性提取出来,就可以获取商品的完整图片了。不过我们还注意data-src属性,它的图片内容也是图片的URL,观察后发现此URL是图片的完整大图,而src是压缩后的小图,所以这里抓取data-src属性来作为商品的图片。可以发现它是一个img节点,包含id、class、data-src、alt和src属性。这里之所以能看到这样的图片,是因为它的src属性被赋值为图片的URL。通过提取它的src属性,可以得到产品的全貌。但是我们也注意了data-src属性,它的图片内容也是图片的URL。经过观察,发现这个URL是图片的完整大图,而src是压缩后的小图,所以这里我们抓取了data-src属性作为商品的图片。

所以我们需要先用find()方法找到图片的这个节点,然后调用attr()方法得到产品的data-src属性,从而成功提取出产品的链接。然后用同样的方法提取商品的价格、体积、名称、店铺位置等信息,然后将提取的结果全部赋给一个字典产品,再调用save_mongo()保存到MongoDB。

6.保存到MongoDB

接下来,我们用下面的代码将产品信息保存到MongoDB:

导入pymongoMONGO _ URL = & # 39本地主机& # 39;MONGO _ DB = & # 39淘宝& # 39;MONGO _ COLLECTION = & # 39产品& # 39;client = pymongo。MONGO client(MONGO _ URL)DB = client[MONGO _ DB]def save _ to _ MONGO(result):& # 34;""将结果保存到MongoDB & # 34""试试:if db[MONGO_COLLECTION]。插入(结果):打印(& # 39;保存到MongoDB成功& # 39;)除了例外:打印(& # 39;保存到MongoDB失败& # 39;)首先创建一个MongoDB的连接对象,然后指定数据库,再指定集合的名称,然后调用insert()方法将数据库插入MongoDB。这里的结果变量是get_products()方法的产品,它包含单个商品的信息。

7.遍历每一页

我们刚刚定义的get_index()方法需要接收参数page,page code page number。我们可以在这里遍历页码,代码如下:

MAX _ PAGE = 10 def main():& # 34;""遍历:返回:& # 34;""对于in range (1,max _ page+1):index _ page(I)time . sleep(10)main()最后调用main()方法运行。

8.异常处理(绕过登录反爬行机制)

写到这里,如果你运行程序,会发现浏览器窗口弹出后,会出现登录页面,但是当你尝试输入账号密码时,滑块的验证总是失败。并且页面会不断刷新。画

直接上淘宝网(网页淘宝登录电脑版)

针对这种情况,博主找到了两种解决方案。

方法一:修改ChromeDriver.exe。

之所以会出现这种情况,是因为淘宝的登录页面有这样一个js,会通过驱动或者其他情况判断你是否打开了浏览器。如果打开驱动,这个判断为真就会出现这种情况,如图,就是判断的js。

直接上淘宝网(网页淘宝登录电脑版)

让我们在控制台上运行这个脚本window.navigator.webdriver。

直接上淘宝网(网页淘宝登录电脑版)

可以看到,判断为真,说明浏览器知道我们在用驱动。

那怎么解决呢?

首先用nodepad++或者记事本打开chrome,查找$cdc,找到这串代码后,用一个等长的字符串替换,比如把最后一个L改成a。

直接上淘宝网(网页淘宝登录电脑版)

然后将部分代码更改为以下模式,并将浏览器设置为开发人员模式:

option = web driver . chrome options()#开发者模式的切换。设置它,当你打开浏览器时,它不会被识别为自动化测试工具。选项。添加实验选项(& # 39;排除开关& # 39;, ['启用-自动化& # 39;])driver = webdriver。chrome(chrome _ options = option)

如果这个方法不行,请看第二个方法。

方法二:在代码中加载用户信息的配置文件。

首先在Chrome中输入Chrome://version/查看信息。如图,这是我们的用户信息。

直接上淘宝网(网页淘宝登录电脑版)

然后在代码中,加载浏览器配置。

chrome_option = webdriver。chrome options()p = r & # 39;C:\Users\赵磊\ appdata \ local \ Google \ chrome \ userdata & # 39;# chrome _ option . add _ experimental _ option(& # 39;排除开关& # 39;, ['启用-自动化& # 39;]) #在开发者模式chrome _ option . add _ argument(& # 39;-user-data-dir = & # 39;+p)browser = web driver . chrome(options = chrome _ option)wait = web driver wait(browser,10)这样爬取时就不会出现登录页面。

直接上淘宝网(网页淘宝登录电脑版)

9.操作

运行代码的时候会发现弹出一个Chrome浏览器,然后会访问淘宝页面,然后控制台输出如下

直接上淘宝网(网页淘宝登录电脑版)

可以发现,这些商品信息的结果都是字典形式的,都存储在MongoDB中。看看MongoDB中的结果。

直接上淘宝网(网页淘宝登录电脑版)

说明信息保存在MongoDB中,抓取成功。

使用Selenium自动秒抢淘宝商品

Selenium有各种编程语言的客户端驱动,编写自动化脚本的语法简洁,其中python的selenium库非常受欢迎。

可以使用selenium进行web测试或抓取,也可以使用selenium自动抢票和下单。

演示自动打开淘宝:

直接上淘宝网(网页淘宝登录电脑版)

使用selenium抢购商品导入selenium相关模块

#从Selenium导入库导入web驱动程序导入日期时间导入时间

打开chrome浏览器

#现在录制时间= datetime.datetime.now()。strftime(& # 39;%Y-%m-%d %H:%M:%S,% f & # 39)#打开chrome浏览器= webdriver.chrome ()

登录淘宝

#登录def login(): #打开淘宝首页,扫码登录browser . get(& # 34;https://www.taobao.com/")time . sleep(3)#打开登录界面find _ log in = browser . find _ element _ by _ link _ text(& # 34;亲爱的,请登录& # 34;)if find _ log in:find _ log in . click()print(& # 34;请扫码登录& # 34;)time.sleep(10) login()

选择购物车列表

# Select购物车列表定义picking(method): # Select所有购物车if method = = 0:while true:try:if browser . find _ element _ by _ id(& # 34;J _ SelectAll1 & # 34):browser . find _ element _ by _ id(& # 34;J _ SelectAll1 & # 34).单击()打印(& # 39;成功选择所有购物车& # 39;)break除外:print(f & # 34;找不到购买按钮& # 34;)else:print(f & # 34;请手动检查要购买的商品& # 34;)time.sleep(1)

点击结算按钮

#点击结算按钮def settlement():while true:try:if browser . find _ element _ by _ id(& # 39;J _ SelectedItemsCount & # 39).text & gt= '1':browser . find _ element _ by _ link _ text(& # 34;算& # 34;).点击()打印(f & # 34结算成功,准备提交订单& # 34;)break except: pass

点击提交订单按钮

#点击提交订单按钮def submitting():while true:try:if browser . find _ element _ by _ link _ text(& # 39;提交订单& # 39;):browser . find _ element _ by _ link _ text(& # 39;提交订单& # 39;).点击()打印(f & # 34购买成功,请尽快付款& # 34;)break除外:print(f & # 34;尝试再次提交订单& # 34;)

开始执行抢购

DEF (Times): #打开购物车列表页面打印(& # 39;正在抢购!')browser . get(& # 34;https://cart.taobao.com/cart.htm")time . sleep(3)while True:now = datetime . datetime . now()。strftime(& # 39;%Y-%m-%d %H:%M:%S,% f & # 39)#对比时间。时间到了,点击结算如果现在>;次:#购物车拣货(0) #点击结算按钮结算()#提交订单提交()打印(现)断希望本文对你有帮助~ ~如果你对软件测试、界面测试、自动化测试、性能测试、面试经验交流感兴趣,可以私信我或者关注微信官方账号“Testin软件测试”。免费获取软件测试厂商最新面试资料和Python自动化、接口和框架搭建学习资料!技术问答,同行交流。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/30408.html

发表回复

登录后才能评论