京东爬取
1.思路
1.通过selenium中的webdriver来进入需要爬取的物品输入框
2.由于是动态页面无法直接提取信息,所以需要通过写入js代码来模拟下拉操作
3.通过bs4中的beautifulsoup来采集信息(我更喜欢xpath)
4.通过启动模拟点击下一页按钮来实现跳转下页功能
2.代码展示
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as bsfrom selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')#打开目标网址
search = input('请输入要搜索的商品:')
driver = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)#声明谷歌浏览器对象
first_url = 'https://www.jd.com/' #入口url
driver.get(first_url)
# driver.maximize_window() #窗口最大化
#找到搜索框
driver.find_element_by_xpath('//*[@id="key"]').clear()
#传入商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(search)
#搜索商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(Keys.ENTER)
index = 0for page in range(1,6):# 声明基础高度height = 0for i in range(1, 11):js = 'var q=document.documentElement.scrollTop=%s' % heightheight += 800driver.execute_script(js)time.sleep(1)# 利用bs4采集相关信息text = driver.page_sourcesoup = bs(text, 'html.parser')lis = soup.find_all('li', class_='gl-item')for li in lis:print("*"*100)index += 1print(li.find('div',class_='p-price').text.strip())print(li.find('div', class_='p-name').text.strip())print(li.find('div', class_='p-shop').text.strip())print('http:'+li.find('div', class_='p-img').a.img.attrs['src'])time.sleep(3)driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a')[-1].click()print('总数据总量{}条'.format(index))
3.代码详解
#打开目标网址
search = input('请输入要搜索的商品:')
driver = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)#声明谷歌浏览器对象
first_url = 'https://www.jd.com/' #入口url
driver.get(first_url)
# driver.maximize_window() #窗口最大化
#找到搜索框
driver.find_element_by_xpath('//*[@id="key"]').clear()
#传入商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(search)
#搜索商品
driver.find_element_by_xpath('//*[@id="key"]').send_keys(Keys.ENTER)
这些代码是通过selenium来获取商品的详情页,其中下面三行代码是为了加快爬取速度而采取无头模式。(执行过程不显示)
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
# 声明基础高度height = 0for i in range(1, 11):js = 'var q=document.documentElement.scrollTop=%s' % heightheight += 800driver.execute_script(js)time.sleep(1)
这些代码是通过js修改下拉框的参数从而模拟下拉操作。
# 利用bs4采集相关信息text = driver.page_sourcesoup = bs(text, 'html.parser')lis = soup.find_all('li', class_='gl-item')for li in lis:print("*"*100)index += 1print(li.find('div',class_='p-price').text.strip())print(li.find('div', class_='p-name').text.strip())print(li.find('div', class_='p-shop').text.strip())print('http:'+li.find('div', class_='p-img').a.img.attrs['src'])
这些事通过bs4,来获取需要的数据
driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a')[-1].click()
driver.find_elements_by_xpath('//*[@id="J_bottomPage"]/span[1]/a')[-1].send_keys(Keys.RETURN)
以上两种选择其中一个来实现跳转页功能,外面还有一个循环来实现页数的控制,第一个直接通过点击,第二个是通过模拟键盘的右方向键。