python爬虫,使用srapy框架以及selenium爬取当当网(http://search.dangdang.com/)搜索框中输入python后的图书数据,请帮我写出具体代码
时间: 2024-04-02 10:36:30 浏览: 237
python爬取dangdang指定图书数据
好的,这是一个比较常见的需求,需要用到 Scrapy 框架和 Selenium 库。
首先,需要在 Scrapy 中创建一个 Spider,并设置起始 URL 为当当网的搜索页面(http://search.dangdang.com/?key=python&act=input)。
然后,需要在 Spider 中使用 Selenium 库模拟用户在搜索框中输入关键词,并点击搜索按钮,以便加载出搜索结果页面。
接下来,我们需要在 Scrapy 的 Item 中定义图书的相关属性,例如书名、作者、出版社、价格等。
然后,在 Spider 中通过 XPath 或 CSS Selector 解析搜索结果页面,提取出每本图书的相关信息,同时使用 Scrapy 的 Item Pipeline 将数据保存到本地或者数据库中。
最后,我们可以使用 Scrapy 的自带命令启动 Spider,开始爬取数据。
当然,具体实现还需要考虑很多细节问题,例如如何处理页面的异步加载、如何使用代理IP等等。
下面是使用 Scrapy 框架和 Selenium 库爬取当当网搜索结果的具体代码:
首先,在终端中使用以下命令创建一个新的 Scrapy 项目:
```bash
scrapy startproject dangdang
cd dangdang
```
然后,在项目根目录下创建一个名为 `spiders` 的文件夹,用于存放 Spider。
接下来,在 `spiders` 文件夹下创建一个名为 `dangdang_spider.py` 的文件,用于编写 Spider 的代码。
首先,在文件头部导入必要的库:
```python
import scrapy
from selenium import webdriver
from scrapy.selector import Selector
from dangdang.items import DangdangItem
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
```
其中,`scrapy` 用于创建 Spider,`webdriver` 用于模拟用户操作,`Selector` 用于解析 HTML 页面,`DangdangItem` 用于定义数据结构。
然后,在 `DangdangSpider` 类中定义必要的属性和方法:
```python
class DangdangSpider(scrapy.Spider):
name = 'dangdang'
allowed_domains = ['dangdang.com']
start_urls = ['http://search.dangdang.com/?key=python&act=input']
def __init__(self):
self.driver = webdriver.Chrome()
def parse(self, response):
self.driver.get(response.url)
wait = WebDriverWait(self.driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".m-list .line1 .pic")))
sel = Selector(text=self.driver.page_source)
items = []
for book in sel.css(".m-list .line1"):
item = DangdangItem()
item["name"] = book.css(".name a::attr(title)").extract_first()
item["author"] = book.css(".search_book_author span:nth-child(1)::text").extract_first()
item["publisher"] = book.css(".search_book_author span:nth-child(3)::text").extract_first()
item["price"] = book.css(".price .search_now_price::text").extract_first()
items.append(item)
return items
def closed(self, reason):
self.driver.quit()
```
其中,`name` 属性为 Spider 的名字,`allowed_domains` 属性为允许爬取的域名,`start_urls` 属性为起始 URL。
在构造函数中,我们创建了一个 Chrome 浏览器实例,用于模拟用户操作。在 `parse` 方法中,我们通过 `driver.get` 方法打开搜索页面,然后使用 `WebDriverWait` 等待页面加载完成,使用 `Selector` 解析页面内容,并提取出每本图书的相关信息,存储到 `DangdangItem` 中,并返回列表。
最后,在 `closed` 方法中,我们关闭 Chrome 浏览器实例,释放资源。
接下来,在项目根目录下创建一个名为 `items.py` 的文件,用于定义数据结构:
```python
import scrapy
class DangdangItem(scrapy.Item):
name = scrapy.Field()
author = scrapy.Field()
publisher = scrapy.Field()
price = scrapy.Field()
```
在 `DangdangItem` 类中,我们定义了图书的四个属性,分别对应书名、作者、出版社、价格。
最后,在终端中使用以下命令启动 Spider:
```bash
scrapy crawl dangdang
```
这样就可以开始爬取当当网搜索结果的数据了。
当然,为了使 Selenium 正常运行,我们还需要在系统中安装 Chrome 浏览器和 ChromeDriver,并将 ChromeDriver 的路径加入系统环境变量中。
阅读全文