import scrapy, requests
from scrapy.http import TextResponse
!scrapy startproject popconeboardgame
!tree popconeboardgame /f
url = 'https://www.popcone.co.kr/goods/goods_list.php?cateCd=038001'
request = requests.get(url)
response = TextResponse(request.url, body=request.text, encoding="utf-8")
'//*[@id="contents"]/div[2]/div/div[2]/div[2]/div/div[1]/ul/li[1]/div/div[2]/div[1]/a'
aa = response.xpath('//*[@id="contents"]/div[2]/div/div[2]/div[2]/div/div[1]/ul/li/div/div[2]/div[1]/a/@href').extract()
links = []
for i in aa:
links.append('https://www.popcone.co.kr'+i[2:])
aa[:2]
# 출력
['../goods/goods_view.php?goodsNo=74187',
'../goods/goods_view.php?goodsNo=86238']
links[:2]
# 출력
['https://www.popcone.co.kr/goods/goods_view.php?goodsNo=74187',
'https://www.popcone.co.kr/goods/goods_view.php?goodsNo=86238']
link = links[0]
request = requests.get(link)
response = TextResponse(request.url, body=request.text, encoding='utf-8')
# 결과데이터가 항상 list로 나옴. 그래서 0번을 가져오도록.
title = response.xpath('//*[@id="frmView"]/div/div/div[1]/h3/text()')[0].extract() # /text() 추가
price = response.xpath('//*[@id="frmView"]/div/div/div[2]/dl[2]/dd/strong/strong/text()')[0].extract() # /text() 추가
title, price
('[온라인콘특가][팝콘게임즈] 익스플로딩 키튼 (63.5x88 FIT 소프트슬리브 100매 증정) / 얼리버드특가', '19,800')
response.xpath('//*[@id="frmView"]/div/div/div[1]/h3/text()')
# 출력
[<Selector xpath='//*[@id="frmView"]/div/div/div[1]/h3/text()' data='[온라인콘특가][팝콘게임즈] 익스플로딩 키튼 (63.5x88 FIT...'>]
%%writefile popconeboardgame/popconeboardgame/items.py
import scrapy
class PopconeboardgameItem(scrapy.Item): # scrapy.Item을 상속 받음
title = scrapy.Field()
price = scrapy.Field()
link = scrapy.Field() # 이 세개의 컬럼으로 수집할 것임
%%writefile popconeboardgame/popconeboardgame/spiders/spider.py
import scrapy
from popconeboardgame.items import PopconeboardgameItem
class GMSpider(scrapy.Spider):
name = "GMB" # 스크래피 프로젝트 실행시 이름으로 사용됨.
# spider 안에는 여러개의 spider class를 만들수 있는데, 난 그중에서 GMB라는 이름의 spider를 사용하겠다
allow_domain = ["popcone.co.kr/"] # 도메인 지정
start_urls = ["https://www.popcone.co.kr/goods/goods_list.php?cateCd=038001"] # 최초의 request response를 하는 url을 써줌.
# 이렇게 설정하면 request response 하는 코드를 이 스크래피가 알아서 해줌. 프레임워크는 빈칸채우기라는 말이 이것!
def parse(self, response): # request 한 url이 response에 들어감. link 데이터를 수집함.
aa = response.xpath('//*[@id="contents"]/div[2]/div/div[2]/div[2]/div/div[1]/ul/li/div/div[2]/div[1]/a/@href').extract()
links = []
for i in aa:
links.append('https://www.popcone.co.kr'+i[2:])
for link in links[:20]: # 200개 수집된것 중에서 20개만 사용(시간이 너무 걸리니까)
yield scrapy.Request(link, callback=self.parse_content)
# 비동기 방식으로 실행되기 때문에, 실행될때 첫번째 링크로 request 하고, 그다음 두번째.. 즉, 실행될때마다 return 데이터가 달라짐
# 최초에 실행되는 메서드는 꼭 parse라고 써줘야하고. yield에 parse_content라고 쓴거 꼭 아래 함수랑 같은걸로 써줘야함(식별자 맞춰야함)
def parse_content(self, response):
item = PopconeboardgameItem() # 3개의 객체를 가지고 있음
item["title"] = response.xpath('//*[@id="frmView"]/div/div/div[1]/h3/text()')[0].extract()
item["price"] = response.xpath('//*[@id="frmView"]/div/div/div[2]/dl[2]/dd/strong/strong/text()')[0].extract()
item["link"] = response.url
yield item
scrapy crawl GMB -o items.csv
를 실행해야함%pwd
# 출력 'c:\\kt_aivle_2_ai_track\\web_crawling'
2, 4, 5.
items.csv
파일이 만들어진걸 확인할 수 있음그러나, items.csv
이 비어있음.
왜 아무것도 크롤링 되지 않았나 robots.txt를 살펴보니,
settings.py 에서 ROBOTSTXT_OBEY 를 False로 바꾸고 재시도
items.csv
파일이 만들어진걸 확인할 수 있음