Как удалить данные невидимых страниц для ссылки ниже (т.е. pg: № 11, 12, 13), следующий код работает до 10 страниц - PullRequest
0 голосов
/ 26 апреля 2018
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd 
import csv

page = urlopen("https://www.flipkart.com/mobiles/samsung~brand/pr?count=40&p%5B%5D=sort%3Drecency_desc&page=1&sid=tyy%2F4io&viewType=list&wid=1.productCard.PMU_V2")
bsObj = BeautifulSoup(page, 'html.parser')
# List to store Next Page URL's.
nxtPageLink = []
# Extraction of Next Page URL.
for nxtLink in bsObj.findAll(class_="_33m_Yg"):
    completeUrl = ("https://www.flipkart.com" + nxtLink.attrs['href'])
    nxtPageLink.append(completeUrl)
# List to store Scraped Product Data.
URL = []
# Extraction of Product Data from URL.
for i in nxtPageLink:
    url = urlopen(i)
    bs= BeautifulSoup(url, 'html.parser')

    for link in bs.findAll(class_="_1UoZlX"):
        urlBuild = ("https://www.flipkart.com" + link.attrs['href'])
        URL.append(urlBuild)

columnsTitles = ['Link']
test_df = pd.DataFrame({ 'Link': URL})
pd.set_option('display.max_colwidth',0)
print(test_df.info())
test_df

Здесь я пытаюсь удалить все URL-адреса продуктов с 13 страниц, но я могу собрать только 10 страниц данных ... Просьба помочь мне

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Номер страницы является частью URL, поэтому одним из подходов будет просто обновлять его каждый раз, пока вы больше не увидите кнопку next:

from bs4 import BeautifulSoup    
from urllib.request import urlopen


page = 1
base_url = 'https://www.flipkart.com/mobiles/samsung~brand/pr?count=40&p%5B%5D=sort%3Drecency_desc&page={}&sid=tyy%2F4io&viewType=list&wid=1.productCard.PMU_V2'
urls = []

while True:
    print("Getting page {}".format(page))
    soup = BeautifulSoup(urlopen(base_url.format(page)), 'html.parser')

    # Extraction of Product Data from URL.
    for link in soup.find_all(class_="_1UoZlX", href=True):
        urls.append("https://www.flipkart.com" + link.attrs['href'])

    if not soup.find(class_="_2kUstJ", text="Next"):
        break

    page += 1
0 голосов
/ 26 апреля 2018

Это потому, что не все номера страниц отображаются на первой странице.

Скребок должен непрерывно получать данные текущей страницы и открывать следующую страницу до конца.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd 
import csv

# List to store Scraped Product Data.
URL = []

# Start page's url
pageUrl="https://www.flipkart.com/mobiles/samsung~brand/pr?count=40&p%5B%5D=sort%3Drecency_desc&page=1&sid=tyy%2F4io&viewType=list&wid=1.productCard.PMU_V2"

while True:
    page = urlopen(pageUrl)
    bsObj = BeautifulSoup(page, 'html.parser')  

    # Extraction of Product Data from URL.
    for link in bsObj.findAll(class_="_1UoZlX"):
        urlBuild = ("https://www.flipkart.com" + link.attrs['href'])
        URL.append(urlBuild)

    # Get Next page's url, if can't break loop
    nxtLink=bsObj.find(class_="_2kUstJ", text="Next")
    if nxtLink == None:
        break

    # Get next page's url
    pageUrl = ("https://www.flipkart.com" + nxtLink.a.attrs['href'])

columnsTitles = ['Link']
test_df = pd.DataFrame({ 'Link': URL})
pd.set_option('display.max_colwidth',0)
print(test_df.info())
test_df

В этом случае test_df содержит 301 строку,

print(test_df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 301 entries, 0 to 300
Data columns (total 1 columns):
Link    301 non-null object
dtypes: object(1)
memory usage: 2.4+ KB
None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...