【问题标题】:Beautifulsoup - scrape webpage - dynamically loading pageBeautifulsoup - 抓取网页 - 动态加载页面
【发布时间】:2018-01-18 21:23:59
【问题描述】:

我想抓取一个网页:https://www.justdial.com/Mumbai/Dairy-Product-Retailers-in-Thane/nct-10152687

我需要所有商店名称、电话和地址的数据

但我最多只能做 10 次 导致加载您需要滚动网页的其他项目

我的代码:

import requests
import bs4

crawl_url = requests.get('https://www.justdial.com/Mumbai/Dairy-Product-
Retailers-in-Thane/nct-10152687', headers={'User-Agent': 'Mozilla/5.0'})
crawl_url.raise_for_status()


soup = bs4.BeautifulSoup(crawl_url.text, 'lxml')

for elems in soup.find_all('span', class_="jcn"):
    select_a = elems.select('a')
    for links in select_a:
        href = links.get('href')
        res = requests.get(href, headers={'User-Agent': 'Mozilla/5.0'})

        xsoup = bs4.BeautifulSoup(res.text, 'lxml')

        Name = xsoup.select('.fn')
        tel = xsoup.select('.tel')
        add = xsoup.select('.adrstxtr')
        a = Name[0]
        b = tel[0]
        c = add[0]
        print(a.getText())
        print("--"*10)
        print(b.getText())
        print("--"*10)
        print(c.getText())
        print("=="*25)

当我们向下滚动页面时,其他项目会加载 所以我想知道如何获得我想要的任意数量的数据/项目

我试过this

但是没听懂嘛,而且我也没有那个POST方法:/

如果需要更多信息告诉我

【问题讨论】:

  • 您可以将代码包装在一个函数中,并使用循环来获取下一页并将 html 传递给该函数。
  • 谢谢!!那行得通:)

标签: python parsing web-scraping beautifulsoup screen-scraping


【解决方案1】:

t.m.adam 给出的解决方案有效 这是代码

import requests
import bs4

def spider(max_pages):
    page = 1
    while page < max_pages:
        url = "https://www.justdial.com/Mumbai/Dairy-Product-Retailers-in-
Thane/nct-10152687/page-%s" % page
        crawl_url = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
        crawl_url.raise_for_status()
        soup = bs4.BeautifulSoup(crawl_url.text, 'lxml')
        for elems in soup.find_all('span', class_="jcn"):
            select_a = elems.select('a')
            for links in select_a:
               href = links.get('href')
               res = requests.get(href, headers={'User-Agent': 
'Mozilla/5.0'})
                xsoup = bs4.BeautifulSoup(res.text, 'lxml')
                Name = xsoup.select('.fn')
                tel = xsoup.select('.tel')
                add = xsoup.select('.adrstxtr')
                a = Name[0]
                b = tel[0]
                c = add[0]
                print(a.getText())
                print("--"*10)
                print(b.getText())
                print("--"*10)
                print(c.getText())
                print("=="*25)
        page += 1


spider(3)

【讨论】:

  • 我会导入时间并在你的循环中加入 time.sleep(1) 或 time.sleep(2) 以避免最大化服务器或被禁止。
  • 我从来没有遇到过任何问题,比如被这个网站禁止,但我仍然设置了 time.sleep 并添加了异常原因,后来我发现一些商店没有提供他们的电话号码。
  • 输出写在哪里
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多