Python: получение цен на смартфоны с сайта

Я хочу узнать цены на смартфоны на этом сайте, http://tweakers.net/. Это голландский сайт. Проблема в том, что цены не собираются с сайта.

Текстовый файл 'TweakersTelefoons.txt' содержит 3 записи:

Samsung-Galaxy-s6-32gb-Цварт

LG-нексус-5x-32gb-Цварт

Huawei-нексус-6p-32gb-Цварт

Я использую Python 2.7, и это код, который я использовал:

import urllib
import re

symbolfile = open("TweakersTelefoons.txt")
symbolslist = symbolfile.read()
symbolslist = symbolslist.split("\n")

for symbol in symbolslist:
    url = "http://tweakers.net/pricewatch/[^.]*/" +symbol+ ".html"
## http://tweakers.net/pricewatch/423541/samsung-galaxy-s6-32gb-zwart.html  is the original html

    htmlfile = urllib.urlopen(url)
    htmltext = htmlfile.read()

    regex = '<span itemprop="lowPrice">(.+?)</span>'
## <span itemprop="lowPrice">€ 471,95</span>  is what the original code looks like
    pattern = re.compile(regex)
    price = re.findall(pattern, htmltext)

    print "the price of", symbol, "is ", price

Выход:

цена samsung-galaxy-s6-32gb-zwart составляет []

цена LG-Nexus-5x-32GB-ZWART является []

цена huawei-nexus-6p-32gb-zwart составляет []

Цены не указаны. Я пытался использовать [^.], Чтобы избавиться от знака евро, но это не сработало.

Кроме того, возможно, что в Европе мы используем "," вместо "." в качестве разделителя для десятичных дробей. Пожалуйста помоги.

Заранее спасибо.

2 ответа

import requests

from bs4 import BeautifulSoup

soup = BeautifulSoup(requests.get("http://tweakers.net/categorie/215/smartphones/producten/").content)

print [(p.a["href"], p.a.text) for p in soup.find_all("p",{"class":"price"})]

Чтобы получить все страницы:

from bs4 import BeautifulSoup

# base url to pass page number to 1-69 in this case
base_url = "http://tweakers.net/categorie/215/smartphones/producten/?page={}"
soup = BeautifulSoup(requests.get("http://tweakers.net/categorie/215/smartphones/producten/").content, "lxml")

# get and store all prices and phone links
data = {1: (p.a["href"], p.a.text) for p in soup.find_all("p", {'class': "price"})}

pag = soup.find("span", attrs={"class":"pageDistribution"}).find_all("a")

# last page number
mx_pg = max(int(a.text) for a in pag if a.text.isdigit())

# get all the pages from the second to  mx_pg 
for i in range(2, mx_pg + 1):
    req = requests.get(base_url.format(i))
    print req
    soup = BeautifulSoup(req.content)
    data[i] = [(p.a["href"], p.a.text) for p in soup.find_all("p",{"class":"price"})]

Вам понадобятся оба запроса, BeautifulSoup. У dict есть ссылки на каждую телефонную страницу, которую вы можете посетить, если хотите почистить больше данных.

Я думаю, что ваша проблема в том, что вы ожидаете, что веб-сервер разрешит подстановочный знак в URL с "http://tweakers.net/pricewatch/[^.]*/ и вы не проверяете возвращенный код, который я подозреваю, 404.

Вам нужно либо идентифицировать идентификатор продукта, если он установлен, либо опубликовать поисковый запрос, используя метод отправки форм.

Другие вопросы по тегам