递归地进行Python网站转义(下一页)

时间:2019-04-06 18:12:24

标签: python selenium web-scraping lxml

3 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

nextNumberIsThere = True
i=1
while nextNumberIsThere:
    driver.execute_script("document.body.scrollHeight");
    profileDetails = driver.find_elements_by_xpath("//ul[@class='profile-details']/li")
    for element in profileDetails:
        print(element.text)
    next = driver.find_elements_by_xpath("//a[text()='"+str(i)+"']")
    i+=1
    if len(next) > 0:
        next[0].click()
    else:
        nextNumberIsThere = False

上面的代码将迭代并获取数据,直到没有数字为止。

如果要分别获取名称,部门,电子邮件,请尝试以下代码:

nextNumberIsThere = True
i=1
while nextNumberIsThere:
    driver.execute_script("document.body.scrollHeight");
    profileDetails = driver.find_elements_by_xpath("//ul[@class='profile-details']")
    for element in profileDetails:
        name = element.find_element_by_xpath("./li[@class='fn']")
        department = element.find_elements_by_xpath("./li[@class='org']")
        email = element.find_element_by_xpath("./li[@class='email']")
        print(name.text)
        print(department.text)
        print(email.text)
        print("------------------------------")
        next = driver.find_elements_by_xpath("//a[text()='"+str(i)+"']")
    i+=1
    if len(next) > 0:
        next[0].click()
    else:
        nextNumberIsThere = False

希望对您有帮助...

答案 1 :(得分:0)

答案 2 :(得分:0)

解决此类问题的常用方法不是使用循环遍历“所有页面”的循环(因为您不知道前面有多少个页面),而是有某种队列,其中抓取一页可以选择将后续页面添加到队列中,以便稍后进行抓取。

在您的特定示例中,在抓取每个页面的过程中,您可以查找到“下一页”的链接,如果有,则将下一页的URL添加到队列中,这样它将在当前页面之后被抓取;当您点击没有“下一页”链接的页面时,队列将为空,并且抓取将停止。 一个更复杂的示例可能包括抓取类别页面,并将其每个子类别作为后续页面添加到抓取队列中,每个子页面又可能将多个项目页面添加到队列中,等等。

看看Scrapy之类的抓取框架,这些抓取框架在其设计中很容易包含此类功能。您可能还会发现其一些其他功能也很有用,例如使用XPath或CSS选择器在页面上查找元素的能力。

Scrapy主页上的第一个示例完全显示了您要实现的功能类型:

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://blog.scrapinghub.com']

    def parse(self, response):
        for title in response.css('.post-header>h2'):
            yield {'title': title.css('a ::text').get()}

        for next_page in response.css('a.next-posts-link'):
            yield response.follow(next_page, self.parse)

关于Scrapy的一个重要说明:它不使用Selenium(至少不是开箱即用),而是下载页面源并对其进行解析。这意味着它无法运行JavaScript,如果您要抓取的网站是客户端生成的,这可能对您来说是个问题。在那种情况下,您可以研究结合了Scrapy和Selenium的解决方案(快速搜索显示了其中的一堆,以及有关此问题的StackOverflow答案),或者您可以坚持使用Selenium抓取代码并自己实现排队机制,而无需Scrapy。