Scrapyã¯ãã€ã³ã¿ãŒãããäžã®èª°ã§ãç¡æã§å©çšã§ãããªãŒãã³ãœãŒã¹ã®ãŠã§ãã¯ããŒãªã³ã°ãã¬ãŒã ã¯ãŒã¯ã§ããScrapyã¯äž»ã«ãŠã§ãã¯ããŒãªã³ã°ããŠã§ãã¹ã¯ã¬ã€ãã³ã°ã«äœ¿çšãããŸããããã¯ããããããŠã§ãããŒãžããããŒã¿ãæœåºããããã®é«éãã€ç°¡åãªæ¹æ³ã§ãããçŸåšã¯Zyteãã¡ã³ããã³ã¹ãè¡ã£ãŠããŸãã
Scrapyã®ã€ã³ã¹ããŒã«
Scrapyãã€ã³ã¹ããŒã«ããã«ã¯ãPython 3.7以éãå¿ èŠã§ãããŸããã·ã¹ãã ããã±ãŒãžãšã®ç«¶åãé¿ãããããå°çšã®virtualenvã«ã€ã³ã¹ããŒã«ããããšããå§ãããŸãã
ã䜿ãã®ãã©ãããã©ãŒã ã«åãããŠãããŠã³ããŒãããŠãã ããã
Scrapyãã€ã³ã¹ããŒã«ããã«ã¯ãAnacondaãŸãã¯Minicondaãã€ã³ã¹ããŒã«ããPythonãèµ·åããŠã次ã®ã³ãã³ããå®è¡ããŸãïŒ
conda install -c conda-forge scrapy
ãããã¯ã次ã®ã³ãã³ããå®è¡ããããšãã§ããŸãïŒ
pip install Scrapy
Ubuntu ã·ã¹ãã ã䜿çšããŠããå Žåã¯ããŸã以äžã®äŸåé¢ä¿ããã¹ãŠã€ã³ã¹ããŒã«ããå¿ èŠããããŸãïŒ
sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
macOS ã·ã¹ãã ã䜿çšããŠããå Žåã¯ãXcode ã³ãã³ãã©ã€ã³ããŒã«ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸããã¿ãŒããã«ãŠã£ã³ããŠãéããæ¬¡ã®ã³ãã³ããå®è¡ããŠãã ããïŒ
xcode-select --install
ããã§ãšãããããŸãïŒã䜿ãã®ããã€ã¹ã« Scrapy ãã€ã³ã¹ããŒã«ãããŸãããããã§ã¯ãWeb ãµã€ãã®ã¯ããŒã«ã詊ã¿ãŠãããŒã¿ãæœåºããŠã¿ãŸãããã
Scrapy ãããžã§ã¯ãã®éå§
æ°ãã Scrapy ãããžã§ã¯ããéå§ããã«ã¯ãã³ãŒããä¿åãããã£ã¬ã¯ããªãæå®ããå¿ èŠããããŸããæ¬¡ã®ã³ãã³ããå®è¡ããŠãã ããïŒ
scrapy startproject scrapetest
ãã®ã³ãã³ããå®è¡ãããšããscrapetestããšããååã®ãã£ã¬ã¯ããªãäœæããããã®äžã«ã¯ä»¥äžã®ãã¡ã€ã«ãå«ãŸããŸãïŒ
_scrapetest/ scrapy.cfg # ãããã€èšå®ãã¡ã€ã«
scrapetest/ # ãããžã§ã¯ãã® Python ã¢ãžã¥ãŒã«ãããããã³ãŒããã€ã³ããŒãããŸã
__init__.py
items.py
middlewares.py
pipelines.py
settings.py
spiders/ # åŸã§ã¹ãã€ããŒãé
眮ãããã£ã¬ã¯ããª
__init__.py
_
Scrapy ãããžã§ã¯ããéå§ããããæ¬¡ã¯ã¹ãã€ããŒãäœæããå¿ èŠããããŸããã¹ãã€ããŒã¯ãScrapy ããŠã§ãããŒãžããæ å ±ãæœåºããããã«äœ¿çšãããã®ã§ãããããå¿ é ã§ããäŸãšããŠããŠã§ããµã€ããquotes.toscrape.comãããããŒã¿ãã¹ã¯ã¬ã€ãã³ã°ããŸãã
ãŸããæ¬¡ã®ã³ãŒããå®è¡ããŸãïŒ
_import scrapy
class QuotesSpider(scrapy.Spider): name = "test" # ã¹ãã€ããŒåã¯äžæã§ããå¿ èŠããããŸã äœæããã¹ãã€ããŒããšã«
def start_requests(self):
urls = [
'https://quotes.toscrape.com/page/1/',
# ãããã®URLãã
ã¹ã¯ã¬ã€ãã³ã°ãããWebããŒãžã«å€æŽããŠãã ãã 'https://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
page = response.url.split("/")[-2]
filename = f'quotes-{page}.html'
with open(filename, 'wb') as f:
f.write(response.body)
self.log(f'ãã¡ã€ã« {filename} ãä¿åããŸãã')
_
ã¹ãã€ããŒãã¯ããŒã«ãéå§ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããå¿ èŠããããŸã:
scrapy crawl test
ãããšããquotes.toscrape.comãã®ãŠã§ããµã€ããã¯ããŒã«ããããšã瀺ãåºåã衚瀺ãããã¯ãã§ãã
ãŠã§ãããŒãžããç¹å®ã®ããŒã¿ãæœåºãããå Žåã¯ãPythonã®ããŒã¯ãŒããyieldãã䜿çšãã以äžã®ã³ãŒããå®è¡ããŸãïŒ
_import scrapy
class QuotesSpider(scrapy.Spider): name = "test" start_urls = [ 'https://quotes.toscrape.com/page/1/', 'https://quotes.toscrape.com/page/2/', ]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
_
ãã®ã³ãŒãã¯ãã¹ã¯ã¬ã€ãã³ã°ãããŠã§ãããŒãžããããã¹ããèè ãã¿ã°ãæœåºãããããããã°ã«è¡šç€ºããŸãã
ç¹å®ã®ããŒãžã ãã§ãªãããŠã§ããµã€ãå ã®ãã¹ãŠã®ããŒãžãã¹ã¯ã¬ã€ãã³ã°ãããå Žåã¯ã次ã®ããã«å®è¡ããŸãïŒ
_import scrapy
class QuotesSpider(scrapy.Spider): name = "test" start_urls = [ 'https://quotes.toscrape.com/page/1/', ]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
'tags': quote.css('div.tags a.tag::text').getall(),
}
next_page = response.css('li.next a::attr(href)').get()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
_
次ã«ãã¹ãã€ããŒãæœåºããããŒã¿ãä¿åããå¿ èŠããããŸããã¹ã¯ã¬ã€ãã³ã°ããããŒã¿ãä¿åããã«ã¯ãåã«æ¬¡ã®ã³ãã³ããå®è¡ããŠãã ããïŒ
scrapy crawl test -O test.json
æ¢åã®ãã¡ã€ã«ã«æ°ããã³ã³ãã³ãã远å ãããå Žåã¯ã代ããã«æ¬¡ã®ã³ãŒããå®è¡ããŠãã ããïŒ
scrapy crawl quotes -o quotes.jsonl
ããã§ãšãããããŸãïŒScrapy ã䜿ã£ãŠããŒã¿ãã¹ã¯ã¬ã€ãã³ã°ããä¿åããäœæ¥ãå®äºããŸãããScrapy ã«ãããŠã§ãã¹ã¯ã¬ã€ãã³ã°ã確å®ã«æåãããããã«ãããã«è¿œå ã§ããããšããããŸããããã¯ãScrapy ãããã·ãå©çšããããšã§ãã
Scrapyãããã·ã®èšå®
Scrapyãããã·ã¯ããã¹ãŠã®Webãªã¯ãšã¹ãã代è¡ããŠåŠçãããããã¹ã¯ã¬ã€ãã³ã°å¯Ÿè±¡ã®ãŠã§ããµã€ãã«ã¯ãããã·ãµãŒããŒã®IPã¢ãã¬ã¹ã®ã¿ã衚瀺ãããŸãã ããªãã®IPã¢ãã¬ã¹ã¯å®å šã«é ãããŸããIPã¢ãã¬ã¹ãç¶ç¶çã«ããŒããŒã·ã§ã³ãããäœå® çšãããã·ãå©çšããããšã§ããŠã§ããµã€ãã¯ãããªãã®ãªã¯ãšã¹ããScrapyã®ãããªãŠã§ãã¹ã¯ã¬ã€ãã³ã°ãããã䜿çšããŠãã誰ãããã®ãã®ã§ã¯ãªããæ¬ç©ã®ãŠãŒã¶ãŒããã®ãã®ã ãšé¯èŠãããããšãã§ããŸãã
äŸãšããŠãããã§ã¯Geonodeãããã·ã䜿çšããŸããGeonodeãããã·ã®è©³çްããŸã å ¥æããŠããªãå Žåã¯ããGeonode ã䜿çšãããããã·ãµãŒããŒã®è©³çްã®ååŸãã®ã»ã¯ã·ã§ã³ã«é²ãã§ãã ããã
Scrapyã§ãããã·ãèšå®ããã«ã¯2ã€ã®æ¹æ³ããããŸãã
1ã€ç®ã®æ¹æ³ã¯ãHTTPProxyMiddlewareãšåŒã°ããScrapyã®ããã«ãŠã§ã¢ãå©çšããããšã§ããããã«ããããããã·ãã©ã¡ãŒã¿ãèªåçã«ããã©ã«ãã®ãããã·ãšããŠèšå®ãããŸãã
次ã®ããã«å®è¡ã§ããŸãïŒ
_def start_requests(self): for url in self.start_urls: return Request(url=url, callback=self.parse, headers={"User-Agent": "My UserAgent"}, meta={"proxy": "premium-residential.geonode.com:9001"}) _
2ã€ç®ã®æ¹æ³ã¯ãç¬èªã®ããã«ãŠã§ã¢ãäœæããããšã§ãããã®æ¹æ³ã¯ããç¬ç«æ§ãé«ããèªç±åºŠãé«ããªããŸãã
次ã®ããã«å®è¡ã§ããŸãïŒ
_from w3lib.http import basic_auth_header
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomProxyMiddleware': 350, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400, }
class CustomProxyMiddleware(object): def process_request(self, request, spider): request.meta[âproxyâ] = "premium-residential.geonode.com:9001" request.headers[âProxy-Authorizationâ] = basic_auth_header(âgeonode_xbYe9H2LYrâ, â9806022c-cd4a-4776-a053-73fee44344ddâ) _
ããã§ãšãããããŸãïŒããã§ãScrapyã䜿ã£ãŠãŠã§ããµã€ããã¹ã¯ã¬ã€ãã³ã°ããéã«ããããã·ãµãŒããŒã远å ãããŸããããããã·ãæ£åžžã«åäœããŠããã確èªãããå Žåã¯ãhttps://www.geonode.com/what-is-my-ipã«ã¢ã¯ã»ã¹ããŠã¿ãŠãã ããã
Geonode
ã䜿çšããŠãããã·ãµãŒããŒã®è©³çްãååŸãã### æé 1. **Geonode
** ã«ã¢ã¯ã»ã¹ããæ¢åã®ã¢ã«ãŠã³ãã§ãã°ã€ã³ããããæ°èŠç»é²ãè¡ã£ãŠãã ããã

æé 2. ããŒã ããŒãžã§ã**ãResidential Servicesã**ãã¯ãªãã¯ããŸãã

æé 3. **ãEndpointsã**ã衚瀺ããããŸã§ç»é¢ãäžã«ã¹ã¯ããŒã«ããŸãã

æé 4. 䜿çšãã ããããã·ãããã³ã«ã ãéžæããŸãïŒãHTTP ãããã³ã«ã ãŸã㯠**ã[SOCKS5
ãããã³ã«](https://geonode.com/blog/beginners-guide-to-socks5-proxies)ã**ã

æé 5. 䜿çšãã ãã»ãã·ã§ã³ã¿ã€ãã ãéžæããŸãïŒãããŒããŒã·ã§ã³ãããã·ã ãŸã㯠ã¹ãã£ãããŒãããã·ã

ã¹ããã 6. 䜿çšãããããã·ãéžæããŸããäŸãšããŠããã€ã©ã€ã衚瀺ãããŠãããããã· **ãpremium-residential.geonode
.com:9001ã** ã䜿çšããŸãã

DNSã®ä»£ããã«IPã¢ãã¬ã¹ã䜿çšãããå Žåã¯ããShow DNSããã¿ã³ã®ãã§ãã¯ãå€ãã ãã§ãIPã¢ãã¬ã¹ã衚瀺ãããŸãã

ã¹ããã 7. 次ã«ããããã·ã¢ã«ãŠã³ãã® ãèªèšŒæ å ±ã ãå¿ èŠã§ããGeonode
ã®å Žåãããã¯ã¢ã«ãŠã³ãã®ããŒã ããŒãžã«è¡šç€ºãããŠããŸãã

