0
点赞
收藏
分享

微信扫一扫

爬虫 练习

静鸡鸡的JC 2022-01-08 阅读 54

爬虫练习:爬取某图片网站

准备

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()
举报

相关推荐

0 条评论