准备
requests, time, selenium
pip install requests
pip selenium
我使用的webdriver是谷歌浏览器,下边的链接提供了谷歌,火狐,IE的下载链接
驱动器地址
思路
先写流程
总的来说,使用request+time+lxml+selenium
首先,不用登录,所以,就设置ua就行了,为了防止被禁,所以,先试试用百度等浏览器的头部进行爬取,封了IP的话,再使用代理
目标url:https://www.jdlingyu.com/tuji
1.打开
2.先下拉,再定位,然后继续下拉,就这样循环
3.定位好后,得到图片,然后写入文件中,文件名用时间轴来命名
3.到最下边,对页数定位,然后点击下一页,不多爬,够10页就行
完整代码
解释都已经放在了注释中
class MySpider:
def __init__(self):
self.request = requests
self.session = self.request.session()
self.url = "https://www.jdlingyu.com/tuji"
self.headers = {
'user-agent':'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)'
}
#self.driver = webdriver.Chrome()
#self.driver.get(self.url)
pass
def inputFile(self,response,suffix:str):
# 写入文件,再这里判断了一下后缀名,防止因为后缀名错误而产生的异常
name = str(time.time()*1000)
fileName = "{}.{}".format(name,suffix)
with open('./pictures/{}'.format(fileName),'wb') as file:
file.write(response)
file.close()
print('保存成功')
pass
return
def getSrcs(self,xpath:str):
elements = self.driver.find_elements_by_xpath(xpath)
count = 1
arrays = list()
for element in elements:
print(element.get_attribute('src')) # 获取元素的src的值
arrays.append(element.get_attribute('src'))
count+=1
if count%3==0:
self.driver.execute_script('scrollBy(0,100)') # 因为驱动器是模拟浏览器,所以一切按照始即操作为准
# 我之前因为没有向下滑动滚轮,导致元素未加载,所以,这次我就直接加了一个滚轮,让元素直接暴露再眼前
return arrays
def run(self):
self.driver = webdriver.Chrome()
self.driver.get(self.url)
time.sleep(1) # 让元素加载一下
xpath='/html/body/div[1]/div[2]/div[2]/div/div[1]/div/ul/li/div/div[1]/a/picture/img'
#页数
page=1
session = requests.session()
while page<15:
self.driver.execute_script('window.scrollTo(document.body.scrollHeight,0)')
time.sleep(2) # 这里加了sleep是为了将元素加载一会,防止元素未加载完成
page+=1
arrays = self.getSrcs(xpath)
for url in arrays: # 保存文件
suffix = url[-3:] # 获取后缀名
self.inputFile(session.get(url).content,suffix)
self.driver.execute_script('scrollTo(0,10000)') # 因为该下一页了,所以直接拉到了页尾,暴露出来下一页的按钮
time.sleep(1) # 这里是为了跳的太快,防止观察不过来而设置的睡眠
nextOneXpath="//*[contains(text(),'❯')]"
# nextTwoXpath="//*[contains(text(),'❯') and @disabled='disabled']"
next = self.driver.find_elements_by_xpath(nextOneXpath)
# invalied = self.driver.find_elements_by_xpath(nextTwoXpath)
# if len(invalied)!=0: break
# 这里的if是为了再最后一页停止。因为,再最后一页,检查下一页按钮,和之前的按钮的唯一差别就是多了disabled属性
# 所以,我再这里使用了两个xpath,当disabled属性出现的时候就到了最后一页,就改停下来了
next=next[0]
print("current_url: {}".format(self.driver.current_url)) # 检查句柄是否已经切换
next.click()
self.driver.close()
return
def test(self): # 此函数是用来测试点击连接是否有效
driver = webdriver.Chrome()
driver.get('https://www.jdlingyu.com/tuji/page/379')
ele = driver.find_element_by_xpath("//*[contains(text(),'❯')]")
xpath = "//*[contains(text(),'❯') and @disabled='disabled']"
ele.click()
if __name__ == '__main__':
m = MySpider()
m.run()
#m.test()