在上文我们学习了一些selenium的知识,本节将使用selenium爬取淘宝商品——美食。
效果大概就是这样:
运行中
目标
打开:https://www.taobao.com,在输入框输入美食搜索后,将搜索到的美食信息,比如说名称,单价,地址,购买人数等信息爬取下来,并保存到MongoDB中。
分析
搜索关键字美食之后,如图
有100页的内容,我们得抓取每一页的信息。观察其URL变化,好像没有发现什么规律。所以,不能按照之前的简单改变URL的方法爬取。
那怎么办呢?
这时,我们可以使用之前学过的selenium的知识,操作浏览器,让其不停的翻页,然后针对每一页,抓取信息。
实践
首先,对于美食而言,具有100个页面,但对于其他一些商品,可不一定。
所以,我们得获取到共有多少页这个信息。
def search_keyword(keyword="美食"):
try:
chrome.get('https://www.taobao.com/')
inputbox = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
inputbox.clear()
inputbox.send_keys(keyword)
button.click()
totalPages = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total'))).text
totalPages = re.search('(\d+)', totalPages).group(1)
return totalPages
except TimeoutException:
return search_keyword(keyword)
测试一下效果:
正确得到了结果。
接下来,我们想让浏览器自动翻页。大致思路如下:
如图,每个页面都有一个输入页数的输入框,以及一个确定按钮,我们只需获取输入框元素,传递页数,点击确定按钮即可,而这一切,都可以用selenium实现。值得注意的是,每次一跳转到相应的页面时,有一个表项颜色不一样,如下图:
表示处在哪个页面,如果这个表项与我们传递的页数一致的话,说明已经跳转成功了,下面附上代码:
def next_page(page_number):
try:
inputbox = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
inputbox.clear()
inputbox.send_keys(page_number)
button.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)))
except TimeoutException:
next_page(page_number)
测试一下:
自动调转
成功了!
接下来,就是抓取页面所需的商品信息了,我们依旧使用BeautifulSoup。
def parse_page():
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items')))
html = chrome.page_source
soup = BeautifulSoup(html, 'lxml')
items = soup.select('#mainsrp-itemlist .items .item')
for item in items:
product = {
'name':item.select('.title')[0].get_text().strip(),
'price':item.select('.g_price-highlight > strong')[0].get_text(),
'deal-cnt':item.select('.deal-cnt')[0].get_text(),
'shop':item.select('.shop')[0].get_text().strip(),
'location':item.select('.location')[0].get_text()
}
print(product)
运行一下,结果如图:
商品信息
最后,把product存入MongoDB即可:
def save_to_DB(item):
if (collection.insert(item)):
print('保存成功!')
else:
print("保存失败!")
整体运行一下代码:
运行中
查看MongoDB,内容已就位!
MongoDB内容
全部代码在:https://github.com/viljw/PythonSpider/blob/master/taobao.py
以上。
网友评论