mirror of
https://github.com/Mueller-Patrick/Betterzon.git
synced 2026-05-26 12:38:03 +00:00
Compare commits
9 Commits
master
...
dbc793cc08
| Author | SHA1 | Date | |
|---|---|---|---|
| dbc793cc08 | |||
| f1d6487701 | |||
| 233a5ba140 | |||
| c7b8b487d2 | |||
| 0a11b2b453 | |||
| d2a4d93f54 | |||
| 9067695195 | |||
| d55646a34e | |||
| 8e58efa42c |
+2
-2
@@ -2,13 +2,13 @@
|
|||||||
<module type="WEB_MODULE" version="4">
|
<module type="WEB_MODULE" version="4">
|
||||||
<component name="FacetManager">
|
<component name="FacetManager">
|
||||||
<facet type="Python" name="Python">
|
<facet type="Python" name="Python">
|
||||||
<configuration sdkName="Python 3.9" />
|
<configuration sdkName="Python 3.9 (venv)" />
|
||||||
</facet>
|
</facet>
|
||||||
</component>
|
</component>
|
||||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
<exclude-output />
|
<exclude-output />
|
||||||
<content url="file://$MODULE_DIR$" />
|
<content url="file://$MODULE_DIR$" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="library" name="Python 3.9 interpreter library" level="application" />
|
<orderEntry type="library" name="Python 3.9 (venv) interpreter library" level="application" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
+3
-1
@@ -1,4 +1,5 @@
|
|||||||
import sql
|
import sql
|
||||||
|
import amazonspider
|
||||||
|
|
||||||
|
|
||||||
def crawl(product_ids: [int]) -> dict:
|
def crawl(product_ids: [int]) -> dict:
|
||||||
@@ -50,13 +51,14 @@ def crawl(product_ids: [int]) -> dict:
|
|||||||
'products_with_problems': products_with_problems
|
'products_with_problems': products_with_problems
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def __crawl_amazon__(product_info: dict) -> tuple:
|
def __crawl_amazon__(product_info: dict) -> tuple:
|
||||||
"""
|
"""
|
||||||
Crawls the price for the given product from amazon
|
Crawls the price for the given product from amazon
|
||||||
:param product_info: A dict with product info containing product_id, vendor_id, url
|
:param product_info: A dict with product info containing product_id, vendor_id, url
|
||||||
:return: A tuple with the crawled data, containing (product_id, vendor_id, price_in_cents)
|
:return: A tuple with the crawled data, containing (product_id, vendor_id, price_in_cents)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
amazonspider.start_crawling()
|
||||||
return (product_info['product_id'], product_info['vendor_id'], 123)
|
return (product_info['product_id'], product_info['vendor_id'], 123)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import scrapy
|
|
||||||
from urllib.parse import urlencode
|
|
||||||
from urllib.parse import urljoin
|
|
||||||
import re
|
|
||||||
import json
|
|
||||||
|
|
||||||
queries = ['iphone']
|
|
||||||
API = ''
|
|
||||||
|
|
||||||
|
|
||||||
def get_url(url):
|
|
||||||
payload = {'api_key': API, 'url': url, 'country_code': 'us'}
|
|
||||||
proxy_url = 'http://api.scraperapi.com/?' + urlencode(payload)
|
|
||||||
return proxy_url
|
|
||||||
|
|
||||||
|
|
||||||
class AmazonSpider(scrapy.Spider):
|
|
||||||
name = 'amazon'
|
|
||||||
|
|
||||||
def start_requests(self):
|
|
||||||
for query in queries:
|
|
||||||
url = 'https://www.amazon.de/s?' + urlencode({'k': query})
|
|
||||||
yield scrapy.Request(url=url, callback=self.parse_keyword_response)
|
|
||||||
|
|
||||||
def parse_keyword_response(self, response):
|
|
||||||
products = response.xpath('//*[@data-asin]')
|
|
||||||
|
|
||||||
for product in products:
|
|
||||||
asin = product.xpath('@data-asin').extract_first()
|
|
||||||
product_url = f"https://www.amazon.de/dp/{asin}"
|
|
||||||
yield scrapy.Request(url=product_url, callback=self.parse_product_page, meta={'asin': asin})
|
|
||||||
|
|
||||||
next_page = response.xpath('//li[@class="a-last"]/a/@href').extract_first()
|
|
||||||
if next_page:
|
|
||||||
url = urljoin("https://www.amazon.de", next_page)
|
|
||||||
yield scrapy.Request(url=url, callback=self.parse_keyword_response)
|
|
||||||
|
|
||||||
def parse_product_page(self, response):
|
|
||||||
asin = response.meta['asin']
|
|
||||||
title = response.xpath('//*[@id="productTitle"]/text()').extract_first()
|
|
||||||
image = re.search('"large":"(.*?)"', response.text).groups()[0]
|
|
||||||
rating = response.xpath('//*[@id="acrPopover"]/@title').extract_first()
|
|
||||||
number_of_reviews = response.xpath('//*[@id="acrCustomerReviewText"]/text()').extract_first()
|
|
||||||
price = response.xpath('//*[@id="priceblock_ourprice"]/text()').extract_first()
|
|
||||||
|
|
||||||
if not price:
|
|
||||||
price = response.xpath('//*[@data-asin-price]/@data-asin-price').extract_first() or \
|
|
||||||
response.xpath('//*[@id="price_inside_buybox"]/text()').extract_first()
|
|
||||||
|
|
||||||
temp = response.xpath('//*[@id="twister"]')
|
|
||||||
sizes = []
|
|
||||||
colors = []
|
|
||||||
if temp:
|
|
||||||
s = re.search('"variationValues" : ({.*})', response.text).groups()[0]
|
|
||||||
json_acceptable = s.replace("'", "\"")
|
|
||||||
di = json.loads(json_acceptable)
|
|
||||||
sizes = di.get('size_name', [])
|
|
||||||
colors = di.get('color_name', [])
|
|
||||||
|
|
||||||
bullet_points = response.xpath('//*[@id="feature-bullets"]//li/span/text()').extract()
|
|
||||||
seller_rank = response.xpath(
|
|
||||||
'//*[text()="Amazon Best Sellers Rank:"]/parent::*//text()[not(parent::style)]').extract()
|
|
||||||
yield {'asin': asin, 'Title': title, 'MainImage': image, 'Rating': rating, 'NumberOfReviews': number_of_reviews,
|
|
||||||
'Price': price, 'AvailableSizes': sizes, 'AvailableColors': colors, 'BulletPoints': bullet_points,
|
|
||||||
'SellerRank': seller_rank}
|
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import scrapy
|
||||||
|
from scrapy.crawler import CrawlerProcess
|
||||||
|
import re
|
||||||
|
|
||||||
|
class AmazonSpider(scrapy.Spider):
|
||||||
|
name = 'amazon'
|
||||||
|
allowed_domains = ['amazon.de']
|
||||||
|
start_urls = ['https://amazon.de/dp/B083DRCPJG']
|
||||||
|
|
||||||
|
# def __init__(self, start_urls):
|
||||||
|
# self.start_urls = start_urls
|
||||||
|
|
||||||
|
def parse(self, response):
|
||||||
|
price = response.xpath('//*[@id="priceblock_ourprice"]/text()').extract_first()
|
||||||
|
if not price:
|
||||||
|
price = response.xpath('//*[@data-asin-price]/@data-asin-price').extract_first() or \
|
||||||
|
response.xpath('//*[@id="price_inside_buybox"]/text()').extract_first()
|
||||||
|
|
||||||
|
euros = re.match('(\d*),\d\d', price).group(1)
|
||||||
|
cents = re.match('\d*,(\d\d)', price).group(1)
|
||||||
|
priceincents = euros + cents
|
||||||
|
|
||||||
|
yield {'price': priceincents}
|
||||||
|
|
||||||
|
|
||||||
|
def start_crawling():
|
||||||
|
process = CrawlerProcess(
|
||||||
|
settings={'COOKIES_ENABLED': 'False', 'CONCURRENT_REQUESTS_PER_IP': 1, 'ROBOTSTXT_OBEY': False,
|
||||||
|
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
|
||||||
|
'DOWNLOAD_DELAY': 3}
|
||||||
|
, install_root_handler=False)
|
||||||
|
process.crawl()
|
||||||
|
process.start()
|
||||||
@@ -8,4 +8,4 @@ default = crawler.settings
|
|||||||
|
|
||||||
[deploy]
|
[deploy]
|
||||||
#url = http://localhost:6800/
|
#url = http://localhost:6800/
|
||||||
project = crawler
|
project = crawler
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import scrapy
|
||||||
|
import re
|
||||||
|
|
||||||
|
class AmazonSpider(scrapy.Spider):
|
||||||
|
name = 'amazon'
|
||||||
|
allowed_domains = ['amazon.de']
|
||||||
|
start_urls = ['https://amazon.de/dp/B083DRCPJG']
|
||||||
|
|
||||||
|
def parse(self, response):
|
||||||
|
price = response.xpath('//*[@id="priceblock_ourprice"]/text()').extract_first()
|
||||||
|
if not price:
|
||||||
|
price = response.xpath('//*[@data-asin-price]/@data-asin-price').extract_first() or \
|
||||||
|
response.xpath('//*[@id="price_inside_buybox"]/text()').extract_first()
|
||||||
|
|
||||||
|
euros = re.match('(\d*),\d\d', price).group(1)
|
||||||
|
cents = re.match('\d*,(\d\d)', price).group(1)
|
||||||
|
priceincents = euros + cents
|
||||||
|
|
||||||
|
yield {'price': priceincents}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user