爬虫 练习

本文介绍了如何使用Python爬虫配合Selenium库动态抓取图片网站的内容。首先,引入requests、time和Selenium库,并设置Chrome webdriver。通过改变User-Agent避免被识别,如果IP被封,可以考虑使用代理。目标网站为https://www.jdlingyu.com/tuji,爬取流程包括打开网页、滚动加载图片、保存图片到本地并命名为时间戳格式,每下拉一定次数滚动页面以加载更多图片。程序会自动检测下一页按钮,爬取10页后停止。完整代码中详细注释了每个步骤,包括图片的保存和页面的翻页逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

准备

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值