scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影
要使用Scrapy-Selenium来爬取豆瓣电影的Ajax、JSON或XML数据,你需要安装Scrapy-Selenium,并编写一个Spider来使用Selenium WebDriver加载页面,并提取所需的数据。以下是一个简单的例子:
- 安装Scrapy-Selenium:
pip install scrapy-selenium
- 确保你有一个Selenium WebDriver,例如ChromeDriver或GeckoDriver。
- 创建一个Scrapy项目和Spider:
scrapy startproject dym_crawler
cd dym_crawler
scrapy genspider dym_spider dym.com
- 编辑
dym_crawler/spiders/dym_spider.py
来使用Selenium:
import json
import scrapy
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class DymSpider(scrapy.Spider):
name = 'dym_spider'
allowed_domains = ['douban.com']
start_urls = ['https://movie.douban.com/']
def start_requests(self):
# 使用SeleniumRequest替代原生的Scrapy Request
yield SeleniumRequest(
self.parse_ajax,
url='https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20',
callback=self.parse,
wait_until=EC.presence_of_element_located((By.CSS_SELECTOR, 'div.indent'))
)
def parse_ajax(self, response):
# 解析Ajax响应内容
data = json.loads(response.text)
for movie in data.get('data', []):
yield {
'title': movie.get('title'),
'rating': movie.get('rating'),
'url': movie.get('url')
}
def parse(self, response):
# 解析页面内容
# 这里你可以提取其他你需要的数据
pass
在上面的代码中,SeleniumRequest
会启动一个Selenium会话,加载页面,并等待直到指定的条件被满足才会继续执行回调函数。在这个例子中,我们等待电影列表出现在页面上,然后解析Ajax响应内容。
确保你的Selenium WebDriver配置正确,并且在运行Spider之前启动了Selenium服务。如果你想要爬取其他类型的数据(如JSON或XML),你可以根据页面上数据的来源调整XPath或CSS选择器来提取数据。
评论已关闭