教你妙用webdriver实现某宝爬虫
selenium是爬虫工程师的一大利器,巧妙利用他,可以轻松应对大部分的Javascripts防爬,真正做到可见即可得,轻松爬下我们需要的内容。
在开始写代码前先要确保我们配置好了相关的环境,具体如何安装webriver可以百度,在这里我不在赘述。
下面开始介绍记录一下针对某宝的selenium爬虫,实现利用selenium登录某宝(隐藏webdriver的特征),检索商品,获取搜索结果信息等。具体实现思路如下——
代码实现
class Browser():
def __init__(self, name, pwd):
options = webdriver.ChromeOptions()
#options.add_argument('--proxy-server=http://' + ip)#可设置webdriver的代理
self.browser = webdriver.Chrome(options=options)
self.name = name
self.pwd = pwd
self.login_url = 'https://login.taobao.com/member/login.jhtml'#tb的登录页面
self.wait = WebDriverWait(self.browser, 10) #设置webdriver的最长等待时间
这里新建了一个例,要求初始化时传入账号与密码
def login(self):
hide_script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});'
self.browser.get(self.login_url)
self.browser.execute_script(hide_script) #隐藏webdriver的特征,特别重要的一步
login = self.wait.until(EC.presence_of_element_located((By.ID, 'fm-login-id')))
pw = self.browser.find_element_by_id('fm-login-password')
login.send_keys(self.name)
pw.send_keys(self.pwd)
pw.send_keys(Keys.ENTER)
self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 's-name')))
这步定义了一个login的方法以实现登录我们的账号,其中我们通过javascripts实现了隐藏webdriver的特征,可以绕过tb的检测,从而避免了烦人的验证,这一步是至关重要的,切记。
def get_goods(self, goods):
url = 'https://s.taobao.com/search?'
new_script = 'window.open()'
self.browser.execute_script(new_script) #新建一个标签页
self.browser.switch_to.window(self.browser.window_handles[1]) #切换到新建的标签页
self.browser.get(url)
search = self.browser.find_element_by_class_name('search-combobox-input')
search.send_keys(goods)
search.send_keys(Keys.ENTER)
这里定义了get_goods的一个方法实现搜索我们需要的商品,使用时需传入商品的名字,如“口红”等之类的。
def parse_pages(self):
script = 'window.scrollTo(0, document.body.scrollHeight)'
self.browser.execute_script(script)
page_source = self.browser.page_source
doc = pq(page_source) #将webdriver获取到的网页源码利用pyquery这个库进行解析
items = doc('div.item.J_MouserOnverReq ')
for item in items.items():
price = item('div.price.g_price.g_price-highlight strong').text()
deal_cnt = item('div.deal-cnt').text()
good_link = item('div.row.row-2.title a').attr('href')
good_name = item('div.row.row-2.title a').text()
good_add = item('div.location').text()
good_shop = item('div.wangwang span').attr('data-nick')
这一步,实现的是解析每一页搜索结果,通过pyquery这个库对网页源码进行解析,获取我们需要的信息,配合下面切换页面的代码即可实现对所有的搜索结果进行爬取解析,得到我们需要的所需要的内容啦。
def get_new_page(self, page):
try:
if page > 1:
input = self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'input.input.J_Input')))
submit = self.wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, 'span.btn.J_Submit')))
input.clear()
input.send_keys(page)
submit.click()
self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'li.item.active > span'), str(page)))
Browser.parse_pages(self)
except TimeoutError:
Browser.get_new_page(self, page)
切换页面的代码很简单,通过接受我们需要切换到的page,在切换页面的输入框内输入page,再点击确认,从而切换到新页面。配合一个
for page in range(1, 50):
get_new_page(page)
便可以实现1-49页面的切换啦。
总结
以上便是一个比较简单的爬虫案例,其中的一些实现方法可能写的不是很号,读者可自行美化完善,还可以在这些的基础上增添更多的功能,进一步完善他的功能,比如数据的保存,商品的评论爬取等等。
-
Python点滴记录人生苦短,何不学PythonOfficial Account
更多内容请关注我,一起学习一起进步吧,后面还会更新更多的干货哦
关注我提高学习效率,Please !