Я пытаюсь очистить сайт с помощью Scrapy и Selenium, и все работает просто отлично, за исключением части кода «yield item».
В части "def parse_product (self, response)" я использую Selenium find_element_by_css_selector, чтобы заполнить список, а затем использую подход "for element in zip (list1, list2 и т. Д.)" Для генерации моегоПредметы. Я также настроил конвейер для экспорта результата в csv.
Проблема в том, что, хотя мой паук чистит объекты правильно (я проверял это с некоторыми отпечатками по пути), часть создания элементане работает, и я получаю пустой CSV.
Я пробовал другой подход, который работает, но слишком медленно. Он заключается в определении промежуточного программного обеспечения для передачи запроса через Selenium, загрузки исходного кода страницы и возврата HtmlResponse. Затем я просто использую метод response.css () для заполнения списков, тот же подход для генерации элементов и тот же конвейер для его экспорта как csv.
spider.py
def __init__(self):
#Headless Option
opt = Options()
opt.headless = True
## get the Firefox profile object
prf = FirefoxProfile()
## Disable CSS
prf.set_preference('permissions.default.stylesheet', 2)
## Disable images
prf.set_preference('permissions.default.image', 2)
self.browser = webdriver.Firefox(firefox_options = opt, firefox_profile = prf)
def parse(self, response):
self.browser.get(response.url)
print('Current URL: ' + response.request.url)
# Find the total number of pages
# Go to last page (click on '>>')
self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(9) a:nth-child(1)').click()
n = self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(7) a:nth-child(1)').get_attribute('text')
pages = int(n.strip())
# Go back to first page (click on '<<')
self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(1) a:nth-child(1)').click()
# Scrape product links
pdcts = []
href = []
i=1
while i<=n:
# Append Product Links
atag = self.browser.find_elements_by_css_selector('div[class*="ph-proucts"] a')
for a in atag:
href.append(a.get_attribute('href'))
prd = list(set(href))
for p in prd:
pdcts.append(p)
# Load new page of products (Click '>')
self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(8) a:nth-child(1)').click()
i+=1
for link in pdcts:
yield scrapy.Request(url = link, callback = self.parse_product)
def parse_product(self, response):
self.browser.get(response.url)
print("Current URL: " + response.request.url)
#Item Initializator
name = []
#Item Filling
try:
n = self.browser.find_element_by_css_selector('div[class="flex xs12 sm12 md12"] h1').text
name.append(string.capwords(n))
except:
n1 = response.request.url
n = n1.split('products/')[1].replace('-',' ')
name.append(string.capwords(n))
#Item Creation
for i in zip(name):
self.browser.quit()
item = ProjectItem()
item['name'] = i[0]
yield item
Ожидаемый результат - CSV с очищенной информацией, но вместо этого я получаю пустую.
Может ли кто-нибудь помочь мне с этим, пожалуйста? Я был бы очень признателен.