python鐖彇娣樺疂鍟嗗搧(娣樺疂selenium鍙嶇埇)

使用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.获得货物清单
首先,你需要构建一个抓取的网址: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。支持从selenium . web driver . support . wait导入WebDriverWaitfrom urllib.parse导入quote import time browser=we b driver . chrome()wait=web driver wait(browser,10)keyword=’ ipad ‘ def index _ page(Page)3360 ‘ ‘ ‘抓取索引页:param page:页码’ ‘ print(‘抓取第一页’,Page,Page ‘)try : URL=’ 3359s.taobao.com/searchq=’ quote(keyword)browser . get(URL)if PageCSS_SELECTOR,’ # main RP-pager p . form input ‘))submit=wait . until(EC . element _ to _ be _ clickable((By。CSS_SELECTOR,’ # main RP-pager p . form span . BTN . j _ Submit ‘))input . clear()input . send _ keys(page)Submit . click()wait . until(EC . text _ to _ be _ present _ in _ element((By .CSS_SELECTOR,’ # main RP-pager Li . item . active span ‘)、str(page)))wait . until(EC . presence _ of _ element _ located((By。CSS_SELECTOR,m-item list . items . item ‘))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解析,实现如下:
Pyquery导入pyquery作为PQ def get _ products () : ‘ ‘提取商品数据’ ‘ html=browser . page _ sourcedoc=PQ(html)items=doc(‘ # main SRP-item list。项目。项)。items : product={ ‘ image ‘ : item . find(‘)中项目的项目()。图片。img’)。attr(‘data-src ‘),’ price’:item.find(‘。价格)。text(),’ deal’:item.find(‘。deal-cnt)。text(),’ title’:item.find(‘。标题)。text(),Shop’ 3360Item.find(‘。商店)。Text(),’ location’ 3360Item.find(‘。位置)。text()} print(product)save _ to _ mongo(product)首先调用page_source属性获取页码的源代码,然后,构造PyQuery对象,提取商品列表。此时使用的CSS选择器是#mainsrp-itemlist。项目。条目,它将匹配整个页面上的所有商品。它的匹配结果有多个,这里我们再遍历一遍,用for循环分别解析每个结果,在每个循环中赋给一个item变量,每个item变量都是一个PyQuery对象,然后调用它的find()方法,传入CSS selector,得到单个商品的具体内容。
比如查商品源代码。
可以发现它是一个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:
导入py mongo _ URL=’ localhost ‘ mongo _ DB=’ Taobao ‘ mongo _ COLLECTION=’ products ‘ client=py mongo。MONGO client(MONGO _ URL)DB=client[MONGO _ DB]Save _ to _ MONGO(result): ‘ ‘将结果保存到MongoDB ‘ ‘ ‘ Try 3360 if DB[MONGO _ collection]。Insert (result) 3360Print(‘保存到MongoDB成功’)exception 3360print(‘保存到MongoDB失败’)这里先创建一个MongoDB的连接对象,然后指定数据库,再指定集合的名称,然后调用Insert()方法将数据库插入到MongoDB中。这里的结果变量是get_products()方法的产品,它包含单个商品的信息。
7.遍历每一页
我们刚刚定义的get_index()方法需要接收参数page,page code page number。我们可以在这里遍历页码,代码如下:
MAX _ PAGE=10 def main(): ‘ ‘ ‘ Traverse : return 3360 ‘ ‘ for I in range(1,MAX _ PAGE 1): index _ PAGE(I)time . sleep(10)main()最后调用main()方法运行。
8.异常处理(绕过登录反爬行机制)
写到这里,如果你运行程序,会发现浏览器窗口弹出后,会出现登录页面,但是当你尝试输入账号密码时,滑块的验证总是失败。并且页面会不断刷新。画
针对这种情况,博主找到了两种解决方案。
方法一:修改ChromeDriver.exe。
之所以会出现这种情况,是因为淘宝的登录页面有这样一个js,会通过驱动或者其他情况判断你是否打开了浏览器。如果打开驱动,这个判断为真就会出现这种情况,如图,就是判断的js。
让我们在控制台上运行这个脚本window.navigator.webdriver。
可以看到,判断为真,说明浏览器知道我们在用驱动。
那怎么解决呢?
首先用nodepad或者Notepad打开chrome,查找$cdc,找到这串代码后,替换成一串等长的,比如把最后一个L改成a。
然后将部分代码更改为以下模式,并将浏览器设置为开发人员模式:
option=web driver . chrome options()#开发者模式的切换。设置好之后,打开浏览器就不会被识别为自动测试工具了。选项。Add _ Experimental _ option(‘排除开关’,[‘ enable-automation ‘])driver=web driver . chrome(chrome _ options=option)
如果这个方法不行,请看第二个方法。
方法二:在代码中加载用户信息的配置文件。
首先在chrome中输入chrome://version/查看信息。如图,这是我们的用户信息。
然后在代码中,加载浏览器配置。
Chrome _ option=web driver . Chrome options()p=r ‘ c : \ users \赵磊\ AppData \ Local \ Google \ Chrome \ User Data ‘ # Chrome _ option . add _ experimental _ option(‘ exclude switches ‘,[‘enable-automation’]) #在开发者模式Chrome _ option . add _ argument(‘-User-Data-dir=’ p)browser=web driver . Chrome(options=Chrome _ option)wait=webdriver wait(browser,10)这样在抓取时就不会出现登录页面,
9.操作
运行代码的时候会发现弹出一个Chrome浏览器,然后会访问淘宝页面,然后控制台输出如下
可以发现,这些商品信息的结果都是字典形式的,都存储在MongoDB中。看看MongoDB中的结果。
说明信息保存在MongoDB中,抓取成功。
用硒自动抓取淘宝商品。selenium有各种编程语言的客户端驱动,编写自动化脚本的语法简洁,其中python的Selenium库非常受欢迎。
可以使用selenium进行web测试或抓取,也可以使用selenium自动抢票和下单。
演示自动打开淘宝:
使用selenium抢购商品并导入selenium相关模块#从Selenium导入库导入WebDriver导入Datetime导入时间
打开chrome浏览器# recorded time now=datetime . datetime . now()。strftime(‘ % y-% m-% d % h :% m :% s . % f ‘)#打开chrome browser=webdriver。铬合金()
登录# login def login(): #打开淘宝首页,登录browser . get(‘ 3359 www.taobao.com/’)time . sleep(3)#打开登录界面find _ log in=browser . find _ element _ by _ link _ text(‘亲爱的,请登录’)if find _ log in : find _ log in . click()print(‘请扫码登录’)time.sleep(10)登录()
Select购物车列表# select购物车列表def picking(method): # select所有购物车if method==03360 while true 3360 try 3360 if browser . find _ element _ by _ id(‘ j _ select all 1 ‘)3360 browser。find _ Element _ By _ ID(‘ J _ SELECT all 1 ‘)。点击()打印(‘所有购物车均选择成功’)断除3360打印(F ‘找不到购买按钮’)其他3360打印(F ‘请手动检查要购买的商品’)时间。睡眠(
点击结算按钮#点击结算按钮def settlement(): while true 3360 try 3360 if browser . find _ element _ by _ id(‘ j _ selecteditemcount ‘)。text=’ 1 ‘ 3360 browser . find _ element _ by _ link _ text(‘ settlement ‘)。点击()打印(f ‘结算成功,准备提交订单’)破位除3360通
点击提交订单按钮#点击提交订单按钮def submitting(): while true 3360 try 3360 if browser . find _ element _ by _ link _ text(‘提交订单’)3360 browser . find _ element _ by _ link _ text(‘提交订单’)。点击()打印(f ‘抢购成功,请尽快付款’)除3360打印(f ‘再次尝试提交订单’)
开始抢购def运行(次)3360 #打开购物车列表页打印(‘抢购!’)browser . get(‘ https://cart . Taobao . com/cart . htm ‘)time . sleep(3)while true : now=datetime . datetime . now()。strftime(‘ % Y-% m-% d % h :% m :% s . % f ‘)#比较时间,当时间到了,点击结算如果现在时间: #挑选所有购物车(0) #点击结算按钮()#提交订单提交()打印(现在)中断。希望本文对你有帮助~ ~如果你对软件测试、接口测试、自动化测试、性能测试、面试经验交流感兴趣,可以私信我或者关注微信官方账号“Testin软件测试”。免费获取软件测试厂商最新面试资料和Python自动化、接口和框架搭建学习资料!技术问答,同行交流。

其他教程

c4d渲染帧数不对(c4d渲染缓存)

2022-8-16 16:50:59

其他教程

AE免费模板下载(免费的ae模板网站)

2022-8-16 16:53:08

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索