现在,许多网站都存在着各式各样的反爬虫技术,但是python中有这么一个库,不敢说能爬取100%的网站,但是至少能爬取95%以上的网站,这个强大的库就是selenium,使用这个库能够完全模拟浏览器的各种功能,虽然相较于requests或者urllib速度较慢一点,但是它也有它自己的优势,使用这个库开启无头浏览器模式的时候,它就是一个浏览器,所以几乎所有的反爬虫技术都对它无用,今天分享的是使用selenium模拟搜索一种商品并爬取一些商品的简单信息。
首先 导入一些我们需要的库:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery.pyquery import PyQuery as pq
import re
这些我们在selenium的官方网站上都能找到用法。使用selenium模拟搜索就是先找到搜索框输入想要搜索的内容,然后点击搜索按钮,并不需要太多的操作,这个如果使用requests或者urllib的话就需要发送一些参数了,但是selenium则完全不用,我们平常怎么使用浏览器操作,就写什么样的代码就ok了,下面input就是输入框,submit就是输入按钮:
browser.get("https://www.jd.com")
input=WebDriverWait(browser,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR,"#key"))
)
submint=WebDriverWait(browser,10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR,"#search > div > div.form > button > i"))
)
input.send_keys("双肩背包")
submint.click()
本次爬虫的详细代码如下:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery.pyquery import PyQuery as pq
import re
browser=webdriver.Chrome() #模拟的浏览器,这里使用的是谷歌浏览器,也没有开启无头模式
wait=WebDriverWait(browser,10) #设置等待时长
#实现查询功能
def search():
try:
browser.get("https://www.jd.com")
# 找到输入框
input=WebDriverWait(browser,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR,"#key"))
)
#找到搜索按钮
submint=WebDriverWait(browser,10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR,"#search > div > div.form > button > i"))
)
#模拟输入并点击
input.send_keys("双肩背包")
submint.click()
#获得结果总共的页数
total=WebDriverWait(browser,10).until(
EC.presence_of_element_located((By.CSS_SELECTOR,"#J_bottomPage > span.p-skip > em:nth-child(1) > b"))
)
#调用的products函数
products()
return total.text
except TimeoutException:
return search()
#模拟翻页
def next_page(pagenumber):
try:
#页码输入框
input=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#J_bottomPage > span.p-skip > input")))
products()
submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_bottomPage > span.p-skip > a")))
input.clear()
#输入页码并点击翻页
input.send_keys(pagenumber)
submit.click()
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,"#J_bottomPage > span.p-num > a.curr"),str(pagenumber)))
except TimeoutException:
next_page(pagenumber)
#获取商品信息
def products():
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#J_goodsList .gl-item")))
html=browser.page_source
doc=pq(html)
items=doc("#J_goodsList .gl-item").items()
for item in items:
product={
# "price":item.find('.p-price').text(),
# "title":item.find('.p-name').text(),
"image":item.find('[target]').attr('src')
# "mall":item.find(".p-shop").text()
}
print(product)
def main():
total=int(search())
for i in range(2,total+1):
next_page(i)
if __name__=="__main__":
main()