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.
Вам нужно либо идентифицировать идентификатор продукта, если он установлен, либо опубликовать поисковый запрос, используя метод отправки форм.