Python使用Selenium+BeautifulSoup爬取淘宝搜索页
使用Selenium驱动chrome页面,获得淘宝信息并用BeautifulSoup分析得到结果。
使用Selenium时注意页面的加载判断,以及加载超时的异常处理。
importjson importre frombs4importBeautifulSoup fromseleniumimportwebdriver fromselenium.common.exceptionsimportTimeoutException fromselenium.webdriver.common.byimportBy fromselenium.webdriver.support.uiimportWebDriverWait fromselenium.webdriver.supportimportexpected_conditionsasEC browser=webdriver.Chrome() #浏览器需要多次使用,所以单独拿出来。设置一个最长的等待时间,等待目标加载完成 wait=WebDriverWait(browser,10) defsearch(keyword): #wait容易出现加载时间长的问题,因此用try来捕捉异常 try: browser.get('https://www.taobao.com') #加载需要一定时间的,设置了等待时间,等待加载 #输入按钮的加载等待 input=wait.until( #设置加载目标,它是一个选择器,参数是需要选择方式和等待加载的内容 EC.presence_of_element_located((By.CSS_SELECTOR,"#q"))#选择CSS选择器和选择内容 ) #提交按钮 submit=wait.until( #EC后面是选择条件,按钮的加载条件最好的是element_to_be_clickable,意思为元素可以点击的 EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm>div.search-button>button")) ) input.send_keys(keyword)#send_keys对输入框输入内容 submit.click()#提交搜索内容,进入下一个页面 #等待页码元素加载完成,并返回最大页码数 total=wait.until( EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager>div>div>div>div.total")) ) #等待加载完成后获取信息 get_products() returntotal.text exceptTimeoutException: #超时后重新请求,因此递归调用 returnsearch() defnext_page(page_number): try: #页码输入框和翻页按钮 input=wait.until( EC.presence_of_element_located((By.CSS_SELECTOR,"#mainsrp-pager>div>div>div>div.form>input")) ) #提交按钮 submit=wait.until( EC.element_to_be_clickable( (By.CSS_SELECTOR,"#mainsrp-pager>div>div>div>div.form>span.btn.J_Submit")) ) input.clear() input.send_keys(page_number) submit.click() #判断翻页成功 wait.until( EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager>div>div>div>ul>li.item.active>span'), str(page_number))) get_products() exceptTimeoutException: returnnext_page(page_number) defget_products(): #判断单个页面是否被加载出来 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist.items.item'))) html=browser.page_source#获取页面源代码,所有的 #使用BS进行分析 soup=BeautifulSoup(html,'lxml') items=soup.select('#mainsrp-itemlist.items.item') foriteminitems: image=item.select('.pic.img')[0]['data-src'] price=item.select('.pricestrong')[0].text deal=item.select('.deal-cnt')[0].text[:-3] title=item.select('.title')[0].text.strip() shop=item.select('.shop')[0].text.strip() location=item.select('.location')[0].text product={ 'image':image, 'price':price, 'deal':deal, 'title':title, 'shop':shop, 'location':location } save_text(product)#下载内容 defsave_text(product): #保存为txt文件,a追加写模式,编码模式utf-8 withopen('text.txt','a',encoding='utf-8')asf: #使用JSON把字典转换为str格式,加换行符 f.write(json.dumps(product,ensure_ascii=False)+'\n') f.close() defmain(): #通过关键字在淘宝进行搜索 total=search('美食') #用正则提取页码数字 total=int(re.compile('(\d+)').search(total).group(1)) #翻页 foriinrange(2,total+1):#循环包含前,不包含尾 next_page(i) browser.close() if__name__=='__main__': main()
更多内容请参考专题《python爬取功能汇总》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。