【发布时间】:2021-02-02 15:37:16
【问题描述】:
我正在尝试使用 Selenium 抓取所有页面并单击下一页按钮。但是,当我转到下一页时,URL 不会改变。我可以移动到所有页面,但我只能从第一页抓取项目,不知道如何让它适用于所有页面。 对我应该做什么有什么建议吗?
提前谢谢你!
代码:
class MilieuProperties(scrapy.Spider):
name = 'milieu_properties'
start_urls = [
# FOR SALE
'https://www.milieuproperties.com/search-results.aspx?paramb=ADVANCE%20SEARCH:%20Province%20(Western%20Cape),%20%20Area%20(Cape%20Town)',
'https://www.milieuproperties.com/RentalByCategory.aspx'
]
def __init__(self):
#headless options
options = Options()
options.add_argument('--no-sandbox')
options.add_argument("--headless")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
self.driver = webdriver.Chrome('path',options=options)
def parse(self,response):
self.driver.get(response.url)
current_page_number = self.driver.find_element_by_css_selector('#ContentPlaceHolder1_lvDataPager1>span').text
while True:
try:
elem = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="ContentPlaceHolder1_lvDataPager1"]/a[text()="Next" and not(@class)]')))
elem.click()
except TimeoutException:
break
WebDriverWait(self.driver, 10).until(lambda driver: self.driver.find_element_by_css_selector('#ContentPlaceHolder1_lvDataPager1>span').text != current_page_number)
current_page_number = self.driver.find_element_by_css_selector('#ContentPlaceHolder1_lvDataPager1>span').text
offering = response.css('span#ContentPlaceHolder1_lblbreadcum::text').get()
try:
offering = 'rent' if 'Rental' in offering else 'buy'
except TypeError:
offering = 'buy'
base_link = response.request.url.split('/')
try:
base_link = base_link[0] + '//' + base_link[2] + '/'
except:
pass
for p in response.xpath('//div[@class="ct-itemProducts ct-u-marginBottom30 ct-hover"]'):
link = base_link + p.css('a::attr(href)').get()
yield scrapy.Request(
link,
callback=self.parse_property,
meta={'item': {
'url': link,
'offering': offering,
}},
)
def parse_property(self, response):
item = response.meta.get('item')
. . .
【问题讨论】:
-
最简单的解决方案就是不要将 Scrapy 与 Selenium 一起使用。你可以只用 Selenium 抓取你想要的所有数据
-
@JaSON 我只会对属性页发出 Scrapy 请求,不太明白为什么这不起作用
-
如果您在 Selenium 中单击 Next 按钮并且 URL 没有更改,您将无法通过使用 Scrapy 请求相同的页面 HTML 来获取所需的数据,您需要将 Cookie 从 Selenium 传递给 Scrapy。但这似乎是多余的操作,因为您已经在所需的页面上,并且可以直接使用 selenium 代码获取数据。简单地说,Scrapy 和 Selenium 之间没有同步,所以当你使用 Selenium 移动到下一页时,Scrapy 并不“知道”它
-
@JaSON 我不确定如何获取所有指向属性页的链接并继续从中收集数据?
-
您不需要任何链接和 HTTP 请求。只需单击下一步按钮即可加载新的 HTML DOM 并使用 Selenium 内置方法/属性抓取所需的数据
标签: python selenium web-scraping scrapy